A principal diferença entre require
e import
, é que require
ela varrerá automaticamente node_modules
para encontrar módulos, mas import
, que vem do ES6, não será.
A maioria das pessoas usa o babel para compilar import
e export
, o que faz import
agir da mesma maneira que require
.
A versão futura do Node.js pode suportar a import
si própria (na verdade, a versão experimental já suporta ) e, a julgar pelas notas do Node.js., import
não suporta node_modules
, baseia-se no ES6 e deve especificar o caminho do módulo.
Então, eu sugiro que você não use import
com babel, mas esse recurso ainda não está confirmado, ele pode suportar node_modules
no futuro, quem saberia?
Para referência, abaixo está um exemplo de como o babel pode converter a import
sintaxe do ES6 na sintaxe do CommonJS require
.
Digamos que o arquivo app_es6.js
contenha esta importação:
import format from 'date-fns/format';
Esta é uma diretiva para importar a função format do pacote de nós date-fns .
O package.json
arquivo relacionado pode conter algo como isto:
"scripts": {
"start": "node app.js",
"build-server-file": "babel app_es6.js --out-file app.js",
"webpack": "webpack"
}
O .babelrc
arquivo relacionado pode ser algo como isto:
{
"presets": [
[
"env",
{
"targets":
{
"node": "current"
}
}
]
]
}
Este build-server-file
script definido no package.json
arquivo é uma diretiva para o babel analisar o app_es6.js
arquivo e produzi-lo app.js
.
Após executar o build-server-file
script, se você abrir app.js
e procurar a date-fns
importação, verá que ela foi convertida para isso:
var _format = require("date-fns/format");
var _format2 = _interopRequireDefault(_format);
A maior parte desse arquivo é um aviso para a maioria dos humanos, no entanto os computadores o entendem.
Também para referência, como um exemplo de como um módulo pode ser criado e importado para o seu projeto, se você instalar date-fns
e abrir, node_modules/date-fns/get_year/index.js
poderá ver que ele contém:
var parse = require('../parse/index.js')
function getYear (dirtyDate) {
var date = parse(dirtyDate)
var year = date.getFullYear()
return year
}
module.exports = getYear
Usando o processo babel acima, seu app_es6.js
arquivo pode conter:
import getYear from 'date-fns/get_year';
// Which year is 2 July 2014?
var result = getYear(new Date(2014, 6, 2))
//=> 2014
E babel converteria as importações em:
var _get_year = require("date-fns/get_year");
var _get_year2 = _interopRequireDefault(_get_year);
E lide com todas as referências à função de acordo.
express
será do tipoany
. Você pode incluir as definições aqui npmjs.com/package/@types/express