require 和import 的主要区别在于require 会自动扫描node_modules 以查找模块,但来自ES6 的import 不会。
大多数人使用babel 来编译import 和export,这使得import 的行为与require 相同。
Node.js 的未来版本可能会支持 import 本身(实际上是 the experimental version already does),从 Node.js 的注释来看,import 将不支持 node_modules,它基于 ES6,并且必须指定模块的路径。
所以我建议你不要在 babel 中使用import,但是这个功能还没有确定,以后可能会支持node_modules,谁知道呢?
作为参考,下面是 babel 如何将 ES6 的 import 语法转换为 CommonJS 的 require 语法的示例。
假设文件app_es6.js 包含此导入:
import format from 'date-fns/format';
这是从节点包date-fns 导入format 函数的指令。
相关的package.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"
}
}
]
]
}
package.json文件中定义的这个build-server-file脚本是babel解析app_es6.js文件并输出文件app.js的指令。
运行build-server-file 脚本后,如果你打开app.js 并查找date-fns 导入,你会看到它已经被转换成这样:
var _format = require("date-fns/format");
var _format2 = _interopRequireDefault(_format);
该文件的大部分内容对大多数人来说都是 gobbledygook,但计算机可以理解。
也作为参考,作为如何创建模块并将其导入项目的示例,如果您安装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
并且 babel 会将导入转换为:
var _get_year = require("date-fns/get_year");
var _get_year2 = _interopRequireDefault(_get_year);
并相应地处理对该函数的所有引用。