如何正确使用 ES6 “导出默认” 和 CommonJS “require”
How to correctly use ES6 "export default" with CommonJS "require"?
我一直在学习Webpack教程。在其中一个部分中,它给出了代码示例,其中包含此问题的一行本质:
export default class Button { /* class code here */ }
在上述教程的下一节中,标题为"代码拆分",上面定义的类是按需加载的,如下所示:
require.ensure([], () => {
const Button = require("./Components/Button");
const button = new Button("google.com");
// ...
});
不幸的是,此代码会引发异常:
Uncaught TypeError: Button is not a function
现在,我知道包含 ES6 模块的正确方法是简单地import Button from './Components/Button';
在文件的顶部,但是在文件的其他任何地方使用这样的结构会使 babel 成为一只悲伤的熊猫:
SyntaxError: index.js: 'import' and 'export' may only appear at the top level
在对上面前面(require.ensure()
)示例进行了一些摆弄之后,我意识到 ES6 export default
语法导出了一个具有名为 default
的属性的对象,其中包含我的代码(Button
函数)。
我确实通过在需要调用后附加.default
来修复损坏的代码示例,如下所示:
const Button = require("./Components/Button").default;
。但我认为它看起来有点笨拙并且容易出错(我必须知道哪个模块使用 ES6 语法,哪个模块使用好的旧module.exports
)。
这让我想到了我的问题:从使用 CommonJS 语法的代码导入 ES6 代码的正确方法是什么?
要将export default
与 Babel 一起使用,您可以执行以下操作之一:
-
require("myStuff").default
-
npm install babel-plugin-add-module-exports --save-dev
或 3:
//myStuff.js
var thingToExport = {};
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = thingToExport;
如果有人使用 gulp + browserify + babelify 在客户端捆绑 js。
尝试以下代码 [gulpfile.js]:
browserify({
entries: "./ui/qiyun-ui/javascripts/qiyun-ui.src.js",
standalone: "qyUI" // To UMD
})
.transform(babelify, {
presets: ["env"],
plugins: ["add-module-exports"] // export default {} => module.exports = exports['default'];
})
.bundle()
不要忘记安装此软件包:https://www.npmjs.com/package/babel-plugin-add-module-exports
相关文章:
- Typescript导入导出的类会发出require(..),从而导致浏览器错误
- 使用BabelJS导出默认变量
- 何时在 JavaScript 中使用导出默认值和导出常量
- 如何使用默认函数导出为 commonjs 模块创建类型
- ES6默认导出和命名导出
- 使用babel在JSX中导出默认值失败
- Typescript:从CommonJS模块导入默认值,从打字文件导出附加类型
- 为什么“导出默认常量”无效
- “require”中的默认根目录是什么
- 如何正确使用 ES6 “导出默认” 和 CommonJS “require”
- ES6导出默认功能
- 当未定义默认导出时,从“模块”导入模块是什么,为什么它与将 * 导入为模块不同
- 在 ReactJS 中导出(默认)类
- 我应该何时在JavaScript/TypeScript中使用“导出默认值”
- 可以't require()Babel 6.x中的默认导出值
- ES6 中的“导出恒量”与“导出默认值”
- Babel 6改变了导出默认值的方式
- ES6导出默认有多个函数相互引用
- ES6导出默认AssignmentExpression
- 如何在导出默认值中传递值