La principale différence entre require
et import
, est que require
le scanne automatiquement node_modules
pour trouver des modules, mais import
, qui vient d'ES6, ne le fera pas.
La plupart des gens utilisent babel pour compiler import
et export
, ce qui fait import
agir de la même manière que require
.
La future version de Node.js pourrait prendre import
en charge elle-même (en fait, la version expérimentale le fait déjà ), et à en juger par les notes de Node.js, import
ne prend pas en charge node_modules
, elle est basée sur ES6 et doit spécifier le chemin du module.
Je vous suggère donc de ne pas l'utiliser import
avec babel, mais cette fonctionnalité n'est pas encore confirmée, elle pourrait prendre node_modules
en charge dans le futur, qui le saurait?
Pour référence, vous trouverez ci-dessous un exemple de la façon dont babel peut convertir la import
syntaxe d' ES6 en syntaxe de CommonJS require
.
Disons que le fichier app_es6.js
contient cette importation:
import format from 'date-fns/format';
Il s'agit d'une directive pour importer la fonction de format à partir du package de nœuds date-fns .
Le package.json
fichier associé pourrait contenir quelque chose comme ceci:
"scripts": {
"start": "node app.js",
"build-server-file": "babel app_es6.js --out-file app.js",
"webpack": "webpack"
}
Le .babelrc
fichier associé pourrait être quelque chose comme ceci:
{
"presets": [
[
"env",
{
"targets":
{
"node": "current"
}
}
]
]
}
Ce build-server-file
script défini dans le package.json
fichier est une directive permettant à babel d'analyser le app_es6.js
fichier et de sortir le fichier app.js
.
Après avoir exécuté le build-server-file
script, si vous ouvrez app.js
et recherchez l' date-fns
importation, vous verrez qu'elle a été convertie en ceci:
var _format = require("date-fns/format");
var _format2 = _interopRequireDefault(_format);
La plupart de ce fichier est englouti par la plupart des humains, mais les ordinateurs le comprennent.
Aussi pour référence, comme exemple de la façon dont un module peut être créé et importé dans votre projet, si vous installez date-fns
puis ouvrez, node_modules/date-fns/get_year/index.js
vous pouvez voir qu'il contient:
var parse = require('../parse/index.js')
function getYear (dirtyDate) {
var date = parse(dirtyDate)
var year = date.getFullYear()
return year
}
module.exports = getYear
En utilisant le processus babel ci-dessus, votre app_es6.js
fichier pourrait alors contenir:
import getYear from 'date-fns/get_year';
// Which year is 2 July 2014?
var result = getYear(new Date(2014, 6, 2))
//=> 2014
Et babel convertirait les importations en:
var _get_year = require("date-fns/get_year");
var _get_year2 = _interopRequireDefault(_get_year);
Et gérez toutes les références à la fonction en conséquence.
express
sera de typeany
. Vous pouvez inclure les définitions d'ici npmjs.com/package/@types/express