require
和
import
最主要的区别在于,
require
会自动扫描
node_modules
以查找模块,但
import
(来自ES6)不会。
大多数人使用
babel来编译
import
和
export
,这使得
import
的行为与
require
相同。
未来版本的Node.js可能会支持
import
本身(实际上,
试验性版本已经支持了),根据Node.js的说明,
import
不支持
node_modules
,它基于ES6,并且必须指定模块的路径。
因此,我建议您不要在babel中使用
import
,但是这个特性尚未确定,未来可能会支持
node_modules
,谁知道呢?
以下是一个示例,说明babel如何将ES6的
import
语法转换为CommonJS的
require
语法。
假设文件
app_es6.js
包含以下导入内容:
import format from 'date-fns/format';
这是一个指令,用于从Node包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"
}
}
]
]
}
build-server-file
脚本在 package.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';
var result = getYear(new Date(2014, 6, 2))
然后Babel将把这些导入转换为:
var _get_year = require("date-fns/get_year");
var _get_year2 = _interopRequireDefault(_get_year);
相应地处理对该函数的所有引用。
express
的类型将是any
。您可以从这里 https://www.npmjs.com/package/@types/express 包含定义。 - fs_import x = require('x')
与var x = require('x')
不同。 - Tomasz Gawel