Compacting node_modules for client-side deployment

2020-02-14 01:13发布

问题:

I'm implementing a client-side application in JavaScript using Node.js. Because I will be deploying the software on many machines, I would like to minimize the size of the package I distribute. In particular, I would like to remove any unnecessary files from node_modules.

For starters this means deduping and pruning the dependency tree, which npm can do for me. But I'd also like to remove all the package.json files and (especially) any other files that are not needed for deployment. In many of the packages I am using there are tons of tests, multiple versions of files (minified, browserified, etc.) and the like. I just need the JavaScript files that are actually used by the running app. Otherwise I'll be distributing a few 100Kb of files that aren't actually used.

I know about node-browserify but my app will be running in a CommonJS environment, not a browser, so I'd like to keep the modules separate and load them with require.

I'm thinking about writing a Grunt plugin that walks the dependency tree using required, pulls out the JavaScript files needed at runtime and writes them to a tree structure so they can be loaded using require (just loading the modules directly without needing a package.json). But I'd like to make sure no one has done this for me before I tackle it.

回答1:

grun-package-minifier is not found ( This is not an actual answer. I wanted to commet in above answer but I do not have sufficient reputation yet :( ).

npm install grunt-package-minifier --save-dev Password: npm WARN package.json zigbee_gateway_js@0.0.0 No repository field. npm WARN package.json zigbee_gateway_js@0.0.0 No README data npm ERR! 404 404 Not Found: grunt-package-minifier npm ERR! 404 npm ERR! 404 'grunt-package-minifier' is not in the npm registry.



回答2:

FWIW: grunt-package-minifier. My use case is a bit unusual since we are developing a cross-browser extension framework. Like Browserify and unlike standard NodeJS deployments we want to minimize the size of our distribution, including any CommonJS modules. But unlike Browserify we support CommonJS so we can keep the module structure rather than concatenating everything into one big file.

Essentially I strip all the package.json, README, test files, etc. from node_modules but keep the essential JavaScript files in a structure that can be used by a CommonJS module loader.