@rapidload/page-optimizer
Version:
Helps you get better page speed scores by analyzing and providing optimal actions (for Wordpress)
103 lines (97 loc) • 4.08 kB
text/typescript
import {defineConfig} from "vite";
import {resolve} from "path";
import react from "@vitejs/plugin-react";
// @ts-ignore
import packageJson from './package.json';
import {dynamicBase} from "vite-plugin-dynamic-base";
export default defineConfig((configEnv) => {
const isDevelopment = configEnv.mode === "development";
const generateSourceMaps = process.env.GENERATE_SOURCE_MAPS === 'true';
const outDir = generateSourceMaps ? 'dist-debug' : 'dist';
return {
base: (process.env.NODE_ENV === "production") ? "/__dynamic_base__/" : "/",
plugins: [
react(),
dynamicBase({
publicPath: 'window.rapidload_optimizer.page_optimizer_package_base',
transformIndexHtml: true // BUILD + PREVIEW in local breaks when true
}),
{
name: 'generate-asset-map',
generateBundle(options, bundle) {
console.log('Generating asset map...');
const assetMap: Record<string, string> = {};
for (const [fileName, asset] of Object.entries(bundle)) {
console.log(asset.name);
if ('fileName' in asset) {
// Remove hash from the key
const keyWithoutHash = asset.fileName.replace(/(.+)\.[\w-]+(\.[^.]+)$/, '$1$2');
assetMap[keyWithoutHash] = asset.fileName;
}
}
const phpArray = Object.entries(assetMap)
.map(([key, value]) => ` '${key}' => '${value}'`)
.join(",\n");
const phpContent = `<?php
define('RAPIDLOAD_ASSET_MAP', [
${phpArray}
]);
`;
this.emitFile({
type: 'asset',
fileName: 'asset-map.php',
source: phpContent
});
console.log('Asset map generated and saved as PHP file');
}
}
],
define: {
'__OPTIMIZER_VERSION__': JSON.stringify(packageJson.version),
},
resolve: {
alias: {
app: resolve(__dirname, "src", "app"),
components: resolve(__dirname, "src", "components"),
'@/components': resolve(__dirname, "src", "components"),
hooks: resolve(__dirname, "src", "hooks"),
lib: resolve(__dirname, "src", "lib"),
},
},
build: {
outDir: outDir,
sourcemap: generateSourceMaps,
rollupOptions: {
output: {
manualChunks: {
['core-vendor']: [
'react',
'react-dom',
'tailwind-merge',
'webfontloader'
],
vendor: [
'prism-react-renderer',
'@tanstack/react-table',
'@radix-ui/react-toast',
'@radix-ui/react-select',
'focus-lock'
],
animations: [
'framer-motion',
],
},
// entryFileNames: `assets/[name].js`,
entryFileNames: `assets/[name].[hash].js`,
chunkFileNames: `assets/[name].[hash].js`,
assetFileNames: (assetInfo) => {
if (assetInfo.name && /\.(woff2?|eot|ttf|otf)$/.test(assetInfo.name)) {
return `assets/[name].[ext]`;
}
return `assets/[name].[hash].[ext]`;
}
}
}
},
};
});