XGH*_*ven 78 javascript ecmascript-6 babeljs
在Babel 5.x中,我可以编写以下代码:
app.js
export default function (){}
Run Code Online (Sandbox Code Playgroud)
index.js
require('babel/register');
require('./app')();
Run Code Online (Sandbox Code Playgroud)
然后,我可以运行node index.js
没有错误.但是,使用Babel 6.x,运行以下代码
index.es6.js
require('babel-core/register');
require('./app')();
Run Code Online (Sandbox Code Playgroud)
导致错误
require(...)不是函数
我想知道为什么?
Igo*_*ush 138
TL; DR
你必须使用
require('./app').default();
Run Code Online (Sandbox Code Playgroud)
说明
Babel 5曾经有过兼容性攻击export default
:如果一个模块只包含一个导出,并且它是默认导出,则将其分配给module.exports
.所以,例如,你的模块app.js
export default function () {}
Run Code Online (Sandbox Code Playgroud)
将被转化为此
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = function () {};
module.exports = exports["default"];
Run Code Online (Sandbox Code Playgroud)
这完全是为了与require
-Babel-transformediled模块兼容(就像你正在做的那样).它也不一致; 如果模块包含命名和默认导出,则它不能是require
-d.
实际上,根据ES6模块规范,默认导出与具有名称的命名导出没有什么不同default
.它只是语法糖,可以在编译时静态解析,所以这
import something from './app';
Run Code Online (Sandbox Code Playgroud)
与此相同
import { default as something } from './app';
Run Code Online (Sandbox Code Playgroud)
话虽如此,似乎Babel 6决定在转换模块时放弃互操作性攻击.现在,您的模块app.js被转换为
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = function () {};
Run Code Online (Sandbox Code Playgroud)
如你所见,没有更多的任务module.exports
.对于require
这个模块,你需要做
require('./app').default();
Run Code Online (Sandbox Code Playgroud)
如果这不起作用
require('./app').default()
Run Code Online (Sandbox Code Playgroud)
用
require('./app').default
Run Code Online (Sandbox Code Playgroud)
最后没有函数调用。
归档时间: |
|
查看次数: |
30955 次 |
最近记录: |