使用Rollup仅转换为CommonJS,无需捆绑

时间:2018-05-16 07:50:32

标签: javascript rollupjs

解决此问题的最佳解决方法是什么?

...或者我应该使用Rollup以外的其他东西来完成这项任务吗?

...

假设我正在开发一个库foo,它暴露了两个es6模块a.jsb.js(即允许import a from foo/aimport 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') }

2 个答案:

答案 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。负载和   转换钩子可以覆盖它。