require和import之间的主要区别是require会自动扫描node_modules以查找模块,而import则不会,它来自ES6。
大多数人使用babel来编译导入和导出,这使得导入与所需的操作一致。
Node.js的未来版本可能会支持导入本身(实际上,实验版本已经支持了),根据Node.js的说明,导入不支持node_modules,它基于ES6,并且必须指定模块的路径。
所以我建议你不要在babel中使用import,但是这个功能还没有被确认,将来可能会支持node_modules,谁知道呢?
作为参考,下面是babel如何将ES6的import语法转换为CommonJS的require语法的示例。
假设fileapp_es6.js包含以下导入:
import format from 'date-fns/format';
这是一个从节点包date-fns导入格式函数的指令。
相关的包。Json文件可以包含如下内容:
"scripts": {
"start": "node app.js",
"build-server-file": "babel app_es6.js --out-file app.js",
"webpack": "webpack"
}
相关的.babelrc文件可能是这样的:
{
"presets": [
[
"env",
{
"targets":
{
"node": "current"
}
}
]
]
}
包中定义的构建服务器文件脚本。Json文件是一个指令,用于Babel解析app_es6.js文件并输出app.js文件。
运行build-server-file脚本后,如果你打开app.js并寻找date-fns导入,你会看到它已经被转换成这样:
var _format = require("date-fns/format");
var _format2 = _interopRequireDefault(_format);
该文件的大部分内容对大多数人来说都是官样文章,但计算机可以理解。
同样作为参考,作为一个模块如何创建和导入到你的项目的例子,如果你安装date-fns,然后打开node_modules/date-fns/get_year/index.js,你可以看到它包含:
var parse = require('../parse/index.js')
function getYear (dirtyDate) {
var date = parse(dirtyDate)
var year = date.getFullYear()
return year
}
module.exports = getYear
使用上面的babel进程,你的app_es6.js文件可以包含:
import getYear from 'date-fns/get_year';
// Which year is 2 July 2014?
var result = getYear(new Date(2014, 6, 2))
//=> 2014
巴别塔会将进口转化为:
var _get_year = require("date-fns/get_year");
var _get_year2 = _interopRequireDefault(_get_year);
并相应地处理对函数的所有引用。