解决此问题的最佳解决方法是什么?
...或者我应该使用Rollup以外的其他东西来完成这项任务吗?
...
假设我正在开发一个库foo,它暴露了两个es6模块a.js
和b.js
(即允许import a from foo/a
和import b from foo/b
)
来源es6模块
// src/a.js
export default function a(x) { return x+'!' }
...
// src/b.js
import a from './a.js'
export default function b() { return a('Hi') }
然后我想将a.js和b.js转换为CommonJs模块并将它们保存在项目的根文件夹中。因此,我希望行import a from './a'
仅转换为const a = require('./a')
并跳过任何捆绑。像这样:
所需的CommonJS输出
// a.js
module.exports = function a(x) { return x+'!' }
...
// b.js
const a = require('./a')
module.exports = function b() { return a('Hi') }
我的第一直觉是在rollup.config.js中使用类似external: (id) => id!==currentFile
的东西来将所有兄弟模块定义为外部模块。 几乎可以但导致相对导入路径被重写为const a = require('./src/a')
(从a.js
文件夹导入src
的es6版本。)
实际结果
// a.js
module.exports = function a(x) { return x+'!' }
...
// b.js
const a = require('./src/a')
module.exports = function b() { return a('Hi') }
答案 0 :(得分:1)
您可以使用:
// rollup.config.js
export default {
input: ['src/a.js', 'src/b.js'],
output: {
dir: '.',
format: 'cjs'
},
experimentalCodeSplitting: true,
}
答案 1 :(得分:0)
还值得一提的是rollup
的{{1}}钩子,因为它使您可以更好地控制排除以及替换导入路径。来自rollup doc:
resolveId
类型:(源:字符串,进口商:字符串)=>字符串|错误空| {id:字符串,外部?:布尔值,moduleSideEffects ?:布尔值|空值} 类型:异步,第一个
定义自定义解析器。解析器对于例如定位 第三方依赖项。返回null延迟到其他resolveId 功能以及最终的默认解析行为;返回 错误的信号源应被视为外部模块,并且 不包含在捆绑包中。如果是相对导入, id的重新规范化与外部选项为 使用。
如果返回对象,则可以将导入解析为 不同的ID,同时将其从捆绑中排除。这个 允许您用外部依赖关系替换依赖关系而无需 用户需要通过手动将其标记为“外部” 外部选项:
resolveId
相对ID(即以./或../开头的ID)不会重新规范化 返回对象时。如果您想要这种行为,请返回 文件系统的绝对位置为id。
如果在第一个钩子中为moduleSideEffects返回false 解析模块ID,没有其他模块从中导入任何内容 模块,那么不检查以下内容就不会包含此模块 模块内部的实际副作用。如果返回true,则汇总 将使用其默认算法将所有语句包括在模块中 具有副作用(例如修改全局或导出) 变量)。如果返回null或省略标志,则 moduleSideEffects将由 treeshake.moduleSideEffects选项或默认为true。负载和 转换钩子可以覆盖它。