![](/img/trans.png)
[英]How can I use Node.js CommonJS modules in ES6 import/export modules using babel or webpack?
[英]Can I use Babel to transpile to ES5 but keep import/export instead of commonjs?
我想创建一个npm库,该库使用ES导入/导出而不是commonjs交付模块(例如lodash-es
这样做)。 如果我没记错的话,提供的代码必须是ES5,并且具有导入/导出功能。
我不知道如何配置Babel来做到这一点。 我希望选项targets.esmodules
应该可以解决问题。
当我在calc.js
包含以下代码时:
// calc.js
export function add (a, b) {
const result = a + b
return result
}
和babel配置.babelrc
:
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"esmodules": true
}
}
]
]
}
运行babel时:
babel calc.js
输出为:
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.add = add;
function add(a, b) {
var result = a + b;
return result;
}
这是CommonJS的( exports.add
)。 选项targets.esmodules
似乎无效。 如何让Babel生成es模块( export function add
)? 还是我误解了在npm上交付ES模块的想法?
根据Rollup文档 ,您似乎确实应该转换一个仅具有import
/ export
,但已经转换出所有其他非ES5语法的版本。 Webpack文档说类似的话。 这种格式假定您的用户使用的是Rollup或Webpack之类的工具,它们本身就支持import
/ export
语句,但随后可以将它们转换为与ES5兼容的语法,而无需通过Babel运行您的库。
而且看起来特别是Redux 通过使用Rollup format
选项实现了这一点,然后在他们的.babelrc
文件中使用了"modules": false
选项来告诉Babel不要转译模块语句。 我不清楚Lodash如何管理它,因为查看其源代码后,我在仓库中看不到任何构建脚本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.