How can I convert a multi-file node.js app to a single file?

后端 未结 4 1596
醉酒成梦
醉酒成梦 2020-12-31 00:16

If I have a node.js application that is filled with many require statements, how can I compile this into a single .js file? I\'d have to manually r

相关标签:
4条回答
  • 2020-12-31 00:53

    Try below:

    1. npm i -g @vercel/ncc

    2. ncc build app.ts -o dist

    see detail here https://stackoverflow.com/a/65317389/1979406

    0 讨论(0)
  • 2020-12-31 00:58

    You can use webpack with target: 'node', it will inline all required modules and export everything as a single, standalone, one file, nodejs module

    http://webpack.github.io/docs/configuration.html#target

    0 讨论(0)
  • 2020-12-31 01:05

    If you want to send common code to the browser I would personally recommend something like brequire or requireJS which can "compile" your nodeJS source into asynchronously loading code whilst maintaining the order.

    For an actual compiler into a single file you might get away with one for requireJS but I would not trust it with large projects with high complexity and edge-cases.

    It shouldn't be too hard to write a file like package.json that npm uses to state in which order the files should occur in your packaging. This way it's your responsibility to make sure everything is compacted in the correct order, you can then write a simplistic node application to reads your package.json file and uses file IO to create your compiled script.

    Automatically generating the order in which files should be packaged requires building up a dependency tree and doing lots of file parsing. It should be possible but it will probably crash on circular dependencies. I don't know of any libraries out there to do this for you.

    0 讨论(0)
  • 2020-12-31 01:11

    Do NOT use requireJS if you value your sanity. I've seen it used in a largish project and it was an absolute disaster ... maybe the worst technical choice made at that company. RequireJS is designed to run in-browser and to asynchronously and recursively load JS dependencies. That is a TERRIBLE idea. Browsers suck at loading lots and lots of little files over the network; every single doc on web performance will tell you this. So you'll very very quickly end up needing a solution to smash your JS files together ... at which point, what's the point of having an in-browser dependency resolution mechanism? And even though your production site will be smashed into a single JS file, with requireJS, your code must constantly assume that any dependency might or might not be loaded yet; in a complex project, this leads to thousands of async load barriers wrapping every interaction point between modules. At my last company, we had some places where the closure stack was 12+ levels deep. All that "if loaded yet" logic makes your code more complex and harder to work with. It also bloats the code increasing the number of bytes sent to the client. Plus, the client has to load the requireJS library itself, which burns another 14.4k. The size alone should tell you something about the level of feature creep in the requireJS project. For comparison, the entire underscore.js toolkit is only 4k.

    What you want is a compile-time step for smashing JS together, not a heavyweight framework that will run in the browser....

    You should check out https://github.com/substack/node-browserify

    Browserify does exactly what you are asking for .... combines multiple NPM modules into a single JS file for distribution to the browser. The consolidated code is functionally identical to the original code, and the overhead is low (approx 4k + 140 bytes per additional file, including the "require('file')" line). If you are picky, you can cut out most of that 4k, which provides wrappers to emulate common node.js globals in the browser (eg "process.nextTick()").

    0 讨论(0)
提交回复
热议问题