web-dev-qa-db-fra.com

La différence entre "require (x)" et import x

Je viens de commencer à travailler sur un petit projet de nœud qui s'interface avec une MongoDB. Cependant, je ne parviens pas à importer correctement les modules de nœud appropriés, même si je les ai installés correctement via npm.

Par exemple, le code suivant renvoie une erreur et m'indique que "Express n'a aucune exportation par défaut":

import express from "express";

Cependant, ce code fonctionne:

const express = require("express");

Ma question est donc la suivante: quelle est la différence de fonctionnement des méthodes d'importation et de méthode variable/require? Je voudrais réparer ce qui nuit à mes importations dans le projet, car cela risque de poser des problèmes supplémentaires en bas de la route.

64
austinthemassive

La réponse qui m'aide à comprendre la différence entre require et import est tiliser Node.js require vs ES6 import/export , qui comprend un diagramme simple:

enter image description here

55
Always Sunny

La principale différence entre require et import est que require analysera automatiquement node_modules pour trouver des modules, mais import, qui provient de ES6, ne le fera pas. .

La plupart des gens utilisent babel pour compiler import et export, ce qui fait que import agit de la même manière que require.

La future version de Node.js pourrait prendre en charge import 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, il repose 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 prendre en charge node_modules à l'avenir, qui le saurait?


Pour référence, voici un exemple de la façon dont babel peut convertir la syntaxe import de ES6 en syntaxe require de CommonJS.

Dites le fileapp_es6.js contient cette importation:

import format from 'date-fns/format';

Ceci est une directive pour importer la fonction format à partir du paquet de noeud date-fns .

Le fichier package.json associé peut contenir quelque chose comme ceci:

"scripts": {
    "start": "node app.js",
    "build-server-file": "babel app_es6.js --out-file app.js",
    "webpack": "webpack"
}

Le fichier .babelrc associé pourrait ressembler à ceci:

{
    "presets": [
        [
            "env",
            {
                "targets":
                {
                    "node": "current"
                }
            }
        ]
    ]
}

Ce script build-server-file défini dans le fichier package.json est une directive permettant à Babel d’analyser le fichier app_es6.js et d’en produire le fichier app.js.

Après avoir exécuté le script build-server-file, si vous ouvrez app.js et recherchez l'importation date-fns, 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 fastidieux pour la plupart des humains, mais les ordinateurs le comprennent.


Également à titre de référence, à titre d'exemple de création et d'importation d'un module 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 fichier 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 gérer toutes les références à la fonction en conséquence.

31
Ayon Lee

Laissez-moi vous donner un exemple pour inclure un module express avec require & import

-exiger

var express = require('express');

-importation

import * as  express from 'express';

Ainsi, après avoir utilisé l’une des déclarations ci-dessus, nous aurons avec nous une variable appelée "express". Maintenant, nous pouvons définir la variable 'app' comme:

var app = express(); 

Nous utilisons donc 'require' avec 'CommonJS' et 'import' avec 'ES6'.

Pour plus d'informations sur les options "Requiert" et "Importer", lisez les liens ci-dessous.

require - Requiert des modules dans Node.js: tout ce que vous devez savoir

import - Mise à jour sur les modules ES6 dans Node.js

6
saikiran_hegde

Pas une réponse ici et plus comme un commentaire, désolé mais je ne peux pas commenter.

Dans le nœud V10, vous pouvez utiliser l'indicateur --experimental-modules pour indiquer à Nodejs que vous souhaitez utiliser import. Mais votre script d'entrée doit se terminer par .mjs.

Notez que ceci est encore une chose expérimentale et ne devrait pas être utilisé en production.

// main.mjs
import utils from './utils.js'
utils.print();
// utils.js
module.exports={
    print:function(){console.log('print called')}
}

Ref 1 - Nodejs Doc

Ref 2 - numéro de github

0
Tianpeng. Xia