如何使用 Vite.js 将 Node.js 代码捆绑到单个文件中?

Har*_*til 5 javascript node.js webpack vite

我试图将我的 Node.js 服务器端代码(Koa 应用程序)捆绑到一个文件中,这是我使用as时Webpack 生成的文件。这也是达到的目的。targetnodencc - node.js compiler collection

我现在正在使用Vite进行我的下一个项目。我可以使用Vite提供的SSR捆绑功能来捆绑代码。但我无法将第三方依赖项捆绑到这个单个文件中(不包括 core/built-in node.jsmodules )。这是我的 Vite 构建脚本:

import path from 'path';
import { build } from 'vite';
import builtinModules from 'builtin-modules';

async function main() {

  const result = await build({
    mode: 'production',
    appType: 'custom',
    root: path.join(process.cwd(), 'backend'),
    ssr: {
      format: 'esm',
      target: 'node',
      
      // By default Vite bundles everything except the one we pass via `external` array.
      external: builtinModules
    },
    build: {
      manifest: false,
      rollupOptions: {
        input: 'backend/main.mjs',
        output: {
          assetFileNames: 'bundle.js'
        }
      },
      outDir: '../dist/backend',
      ssr: true,
      emptyOutDir: true
    },
    plugins: [],
  });
}

main();

Run Code Online (Sandbox Code Playgroud)

在上面的代码中,builtinModules只是所有核心node.js模块的字符串数组:

// builtinModules
[
  'assert',         'async_hooks',
  'buffer',         'child_process',
  'cluster',        'console',
  'constants',      'crypto',
  'dgram',          'diagnostics_channel',
  'dns',            'domain',
  'events',         'fs',
  'http',           'http2',
  'https',          'inspector',
  'module',         'net',
  'os',             'path',
  'perf_hooks',     'process',
  'punycode',       'querystring',
  'readline',       'repl',
  'stream',         'string_decoder',
  'timers',         'tls',
  'trace_events',   'tty',
  'url',            'util',
  'v8',             'vm',
  'worker_threads', 'zlib'
] 
Run Code Online (Sandbox Code Playgroud)

对于我的原始源代码:

// main.mjs
import path from 'path';

import Koa from 'koa';

async function main() {
  console.log('Source folder', path.join(__dirname, 'src'));

  const app = new Koa();

  app.listen(3000);
}

main();
Run Code Online (Sandbox Code Playgroud)

上述 Vite 构建配置的生成输出是:

// bundle.js
import path from "path";
import Koa from "koa";
async function main() {
  console.log("Source folder", path.join(__dirname, "src"));
  const app = new Koa();
  app.listen(3e3);
}
main();
Run Code Online (Sandbox Code Playgroud)

理想情况下,我预计它将koa在最终输出中捆绑包,仅留下本机path模块。但事实并非如此。

那么,如何将整个后端/Node.js 源代码捆绑编译成单个文件,只留下核心 Node.js 模块作为外部模块,因为 Node.js 是我的代码的运行时?vite 服务器选项也提供了该noexternal选项,但将其设置为true仅适用于没有任何内置节点模块可用的webworker运行时。

san*_*lot 0

最新的 vite 版本正在使用预加载,您应该调整一些汇总选项以禁用代码分割

import { defineConfig } from 'vite' // 2.8.0
import react from '@vitejs/plugin-react' // 1.0.7

export default defineConfig ({
  plugins: [react()],
  build: {
    rollupOptions: {
      output: {
        manualChunks: {}
      },
    },
  },
})
Run Code Online (Sandbox Code Playgroud)