Skip to content

Instantly share code, notes, and snippets.

@izaera
Created April 16, 2024 10:17
Show Gist options
  • Save izaera/42fdef0c42c910cd34385e9e799fdf55 to your computer and use it in GitHub Desktop.
Save izaera/42fdef0c42c910cd34385e9e799fdf55 to your computer and use it in GitHub Desktop.
Compare webpack and esbuild builds
/* package.json
{
"name": "compare",
"private": true,
"version": "1.0.13",
"devDependencies": {
"acorn": "^8.11.3",
"acorn-walk": "^8.3.2"
},
"scripts": {
"compare": "node ./compare.js"
}
}
*/
const acorn = require('acorn');
const walk = require('acorn-walk');
const fs = require('fs');
fs.readdirSync('./exports.webpack').forEach(
file => {
console.log('');
console.log(file);
const webpack = acorn.parse(
fs.readFileSync(`./exports.webpack/${file}`, 'utf-8'),
{ecmaVersion: 2020, sourceType: 'module'}
);
const esbuild = acorn.parse(
fs.readFileSync(`/home/ivan/Liferay/Portal/liferay-portal/modules/apps/frontend-js/frontend-js-dependencies-web/build/node/packageRunBuild/resources/__liferay__/exports/${file}`, 'utf-8'),
{ecmaVersion: 2020, sourceType: 'module'}
);
const anawebpack = analyze(webpack);
const anaesbuild = analyze(esbuild);
compare(anawebpack, anaesbuild);
}
);
function analyze(ast) {
const exported = {};
const imported = {};
walk.simple(ast, {
ImportDeclaration(node) {
imported[node.source.value] = true;
},
ExportAllDeclaration(node) {
console.log(JSON.stringify(node,null,2))
},
ExportDefaultDeclaration(node) {
console.log(JSON.stringify(node,null,2))
},
ExportNamedDeclaration(node) {
node.specifiers.map(x => x.exported.name).forEach(x => exported[x] = true);
},
});
return {
imported,
exported
};
}
function compare(webpack, esbuild) {
let common = [];
Object.keys(webpack.exported).forEach(k => {
if (esbuild.exported[k]) {
common.push(k);
}
});
common.forEach(k => {
delete webpack.exported[k];
delete esbuild.exported[k];
});
if (Object.keys(webpack.exported).length) {
console.log(` webpack only exports:\n${Object.keys(webpack.exported).map(l => ` ${l}`).join('\n')}`);
}
if (Object.keys(esbuild.exported).length) {
console.log(` esbuild only exports:\n${Object.keys(esbuild.exported).map(l => ` ${l}`).join('\n')}`);
}
common = [];
Object.keys(webpack.imported).forEach(k => {
if (esbuild.imported[k]) {
common.push(k);
}
});
common.forEach(k => {
delete webpack.imported[k];
delete esbuild.imported[k];
});
if (Object.keys(webpack.imported).length) {
console.log(` webpack only imports:\n${Object.keys(webpack.imported).map(l => ` ${l}`).join('\n')}`);
}
if (Object.keys(esbuild.imported).length) {
console.log(` esbuild only imports:\n${Object.keys(esbuild.imported).map(l => ` ${l}`).join('\n')}`);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment