Created
April 16, 2024 10:17
-
-
Save izaera/42fdef0c42c910cd34385e9e799fdf55 to your computer and use it in GitHub Desktop.
Compare webpack and esbuild builds
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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