在Rollup中不使用node resolve插件,如何通过命令行用--external排除模块?
你遇到的问题主要出在两个地方:一是Rollup命令的参数顺序错了,导致它把--external当成了入口文件;二是--external指定的路径没匹配上你实际的导入语句。我来一步步帮你搞定:
1. 先修正命令参数顺序
Rollup的命令语法是 rollup [配置选项] <入口文件>,所有像--format、--file、--external这类选项,必须放在入口文件前面。你之前把--external放在src/main.js后面,Rollup会误以为--external是第二个入口文件,所以才会报错Could not resolve entry (--external)。
2. 匹配正确的外部模块路径
因为你没用到node-resolve插件,Rollup不会自动把node_modules里的模块识别成外部依赖,所以得明确指定和你导入语句匹配的路径:
方式1:精准匹配导入的相对路径
你的导入语句是import { html, render } from '../../node_modules/lit-html/lit-html.js',直接把这个路径作为--external的参数就行:
rollup --format=esm --file=dist/bundle.js --external '../../node_modules/lit-html/lit-html.js' src/main.js
方式2:用通配符适配更多场景
如果后续还有其他从lit-html导入的文件,用通配符会更省心,能匹配所有相关路径:
rollup --format=esm --file=dist/bundle.js --external '**/node_modules/lit-html/**' src/main.js
3. 更靠谱的配置文件方式
要是命令行参数太繁琐,推荐用Rollup配置文件(rollup.config.js),配置更清晰也更容易维护:
export default { input: 'src/main.js', output: { file: 'dist/bundle.js', format: 'esm' }, // 只要导入路径包含node_modules/lit-html/,就视为外部模块 external: (id) => id.includes('node_modules/lit-html/') };
之后只需要运行这条命令就行:
rollup -c
验证结果
打包完成后打开dist/bundle.js,你会看到原有的import { html, render } from '../../node_modules/lit-html/lit-html.js'语句被完整保留,lit-html的代码不会被打包进来,这样就能在浏览器里正常运行了。
内容的提问来源于stack exchange,提问作者user8555599

