La principale différence entre require
et import
c'est que require
va automatiquement scanner node_modules
pour trouver des modules, mais import
qui provient de l'ES6, ne le fera pas.
La plupart des gens utilisent babel pour compiler import
et export
ce qui rend import
agissent de la même manière que require
.
La future version de Node.js pourrait supporter import
lui-même (en fait, la version expérimentale le fait déjà ), et à en juger par les notes de Node.js, import
ne supportera pas node_modules
il est basé sur ES6, et doit spécifier le chemin du module.
Je vous suggère donc de ne pas utiliser import
avec babel, mais cette fonctionnalité n'est pas encore confirmée, elle pourrait supporter node_modules
dans le futur, qui le saurait ?
À titre de référence, voici un exemple de la façon dont babel peut convertir des fichiers ES6 import
à la syntaxe de CommonJS require
la syntaxe.
Disons que le fichier app_es6.js
contient cette importation :
import format from 'date-fns/format';
Il s'agit d'une directive pour importer le format de l'ensemble des nœuds date-fns .
L'association package.json
pourrait contenir quelque chose comme ceci :
"scripts": {
"start": "node app.js",
"build-server-file": "babel app_es6.js --out-file app.js",
"webpack": "webpack"
}
Les .babelrc
pourrait être quelque chose comme ceci :
{
"presets": [
[
"env",
{
"targets":
{
"node": "current"
}
}
]
]
}
Ce site build-server-file
script défini dans le fichier package.json
est une directive pour que babel analyse le fichier app_es6.js
et de sortir le fichier app.js
.
Après avoir exécuté le build-server-file
script, si vous ouvrez app.js
et cherchez le date-fns
importé, vous verrez qu'il a été converti en ceci :
var _format = require("date-fns/format");
var _format2 = _interopRequireDefault(_format);
La plupart de ce fichier est un charabia pour la plupart des humains, mais les ordinateurs le comprennent.
Toujours pour référence, à titre d'exemple de la manière dont un module peut être créé et importé dans votre projet, si vous installez date-fns
et ensuite ouvrir 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
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 traitez toutes les références à la fonction en conséquence.
3 votes
Si vous n'incluez pas les définitions de typage pour express, la première forme n'aura pas de sens - dans ce cas, vous pouvez utiliser la deuxième forme, mais la variable
express
sera de typeany
. Vous pourriez inclure les définitions d'ici npmjs.com/package/@types/express6 votes
Duplicata possible de Utilisation de Node.js require vs. import/export ES6
0 votes
@Ryall c'est une question différente. Avis
import x = require('x')
n'est pas la même chose quevar x = require('x')
.