Vite构建应用时如何排除指定JS脚本使其不被打包处理
由于另一已知问题,我需要在Vue3应用的HTML文件中静态引入一个JS依赖。
/index.html中引入代码如下:
<head> <!-- 其余头部配置 --> <script type="module" src="node_modules/@telekom/scale-components-neutral/dist/scale-components/scale-components.esm.js"></script> </head>
因为Vite无法正常打包该依赖,我希望构建流程直接忽略这个依赖,生产构建产物根目录下的index.html保留这段JS模块的原始引入语句,不对其做打包处理。
我最初尝试在optimizeDeps.exclude配置项中添加各类匹配规则,但Vite仍然会尝试分析并预打包该依赖。
vite.config.ts配置尝试如下:
export default defineConfig({ optimizeDeps: { exclude: [ // 我几乎试了所有可行的匹配规则,完全没法让Vite预打包流程忽略该依赖 'scale-components-neutral', '@telekom/scale-components-neutral', '@telekom/scale-components-neutral/**/*', '@telekom/scale-components-neutral/**/*.js', 'node_modules/@telekom/scale-components-neutral/**/*.js' ], }, // 其余配置 });
所有配置尝试均无效,执行npm run build后,dist/index.html中对应的引入语句都会被移除,我想了解optimizeDeps.exclude配置的正确匹配规则是什么?
补充说明1
根据Vite官方文档中的说明:
依赖预打包仅在开发模式下生效,该过程使用esbuild将依赖转换为ESM格式;生产构建时会使用@rollup/plugin-commonjs处理依赖。
基于该说明,我尝试配置build.commonjsOptions.exclude项。
vite.config.js配置尝试如下:
export default defineConfig({ build: { commonjsOptions: { exclude: [ 'scale-components-neutral', 'node_modules/@telekom/scale-components-neutral', 'node_modules/@telekom/scale-components-neutral/**/*', 'node_modules/@telekom/scale-components-neutral/**/*.js', '/node_modules/@telekom/scale-components-neutral', '/node_modules/@telekom/scale-components-neutral/**/*', '/node_modules/@telekom/scale-components-neutral/**/*.js', '**/node_modules/@telekom/scale-components-neutral', '**/node_modules/@telekom/scale-components-neutral/**/*', '**/node_modules/@telekom/scale-components-neutral/**/*.js', '@telekom/scale-components-neutral', '@telekom/scale-components-neutral/**/*', '@telekom/scale-components-neutral/**/*.js', '**/node_modules/@telekom/scale-components-neutral/dist/scale-components/scale-components.esm.js', ], }, }, // 其余配置
该方案仍然无效,dist/index.html中的引入语句依旧会被移除。
补充说明2
我后续尝试配置build.rollupOptions.external与build.dynamicImportVarsOptions.exclude(因初始问题与动态导入相关,这两个配置项看起来符合需求),但依然没有解决问题:该JS依赖仍然被错误打包,本地开发环境运行正常,但执行npm run build构建部署后的应用无法正常运行。
内容的提问来源于stack exchange,提问作者Eria

