Ik ben net begonnen met het werken aan een klein knooppuntproject dat zal communiceren met een MongoDB. Ik krijg de relevante node-modules echter niet correct geïmporteerd, ook al heb ik ze correct geïnstalleerd via npm
.
Bijvoorbeeld, de volgende code geeft een foutmelding, die me vertelt dat “express geen standaard export heeft”:
import express from "express";
Deze code werkt echter:
const express = require("express");
Dus mijn vraag is, wat is het verschil in de manier waarop de import- en variabele/vereiste-methoden werken?Ik zou graag willen repareren wat mijn importen in het project teistert, aangezien het waarschijnlijk lijkt te zijn later extra problemen veroorzaken.
Antwoord 1, autoriteit 100%
Dit eenvoudige diagram helpt me het verschil te begrijpen tussen require
en import
.
Afgezien daarvan,
Je kuntniet selectief alleen de stukken laden die je nodig hebt met require
maar met imports
kun je selectief alleen de stukken laden die je nodig hebt . Dat kan geheugen besparen.
Het laden is synchroon(stap voor stap) voor require
aan de andere kant kan import
asynchroon zijn (zonder te wachten op eerdere import), dus het kan iets beter presteren danrequire
.
Antwoord 2, autoriteit 33%
Het belangrijkste verschil tussen require
en import
is dat require
automatisch node_modules
scant om modules te vinden, maar import
, dat van ES6 komt, doet dat niet.
De meeste mensen gebruiken babelom import
en export
te compileren , waardoor import
hetzelfde werkt als require
.
De toekomstige versie van Node.js ondersteunt mogelijk import
zelf (eigenlijk de experimentele versie doet dat al), en te oordelen naar de opmerkingen van Node.js, zal import
node_modules
niet ondersteunen, het is gebaseerd op ES6 en moet het pad van de module specificeren.
Dus ik raad je aan om import
niet te gebruiken met babel, maar deze functie is nog niet bevestigd, het zou in de toekomst node_modules
kunnen ondersteunen, wie weet?
Ter referentie, hieronder is een voorbeeld van hoe babel de import
-syntaxis van ES6 kan converteren naar de require
-syntaxis van CommonJS.
Stel dat het bestandapp_es6.js
deze import bevat:
import format from 'date-fns/format';
Dit is een instructie om de functie formatte importeren uit het node-pakket date-fns.
Het gerelateerde bestand package.json
kan zoiets als dit bevatten:
"scripts": {
"start": "node app.js",
"build-server-file": "babel app_es6.js --out-file app.js",
"webpack": "webpack"
}
Het gerelateerde .babelrc
-bestand kan er ongeveer zo uitzien:
{
"presets": [
[
"env",
{
"targets":
{
"node": "current"
}
}
]
]
}
Dit build-server-file
-script gedefinieerd in het bestand package.json
is een instructie voor babel om het bestand app_es6.js
te ontleden en voer het bestand app.js
uit.
Na het uitvoeren van het build-server-file
script, als u app.js
opent en zoekt naar de date-fns
import, zal zien dat het in dit is omgezet:
var _format = require("date-fns/format");
var _format2 = _interopRequireDefault(_format);
Het grootste deel van dat bestand is voor de meeste mensen gobbledygook, maar computers begrijpen het.
Ook ter referentie, als voorbeeld van hoe een module kan worden gemaakt en geïmporteerd in uw project, als u date-fns
installeert en vervolgens node_modules/date-fns/get_year/index.js
je kunt zien dat het het volgende bevat:
var parse = require('../parse/index.js')
function getYear (dirtyDate) {
var date = parse(dirtyDate)
var year = date.getFullYear()
return year
}
module.exports = getYear
Als je het bovenstaande babel-proces gebruikt, kan je bestand app_es6.js
het volgende bevatten:
import getYear from 'date-fns/get_year';
// Which year is 2 July 2014?
var result = getYear(new Date(2014, 6, 2))
//=> 2014
En babel zou de invoer converteren naar:
var _get_year = require("date-fns/get_year");
var _get_year2 = _interopRequireDefault(_get_year);
En behandel alle verwijzingen naar de functie dienovereenkomstig.
Antwoord 3, autoriteit 9%
Laat me een voorbeeld geven voor het opnemen van een express-module met required & importeren
-vereist
var express = require('express');
-importeren
import * as express from 'express';
Dus na het gebruik van een van de bovenstaande uitspraken hebben we een variabele met de naam ‘express’ bij ons. Nu kunnen we de ‘app’-variabele definiëren als,
var app = express();
Dus we gebruiken ‘require’ met ‘CommonJS’ en ‘import’ met ‘ES6’.
Voor meer informatie over ‘vereisen’ & ‘import’, lees onderstaande links door.
require – Modules vereist in Node.js: Alles wat u moet weten
importeren – Een update over ES6-modules in Node.js
Antwoord 4, autoriteit 3%
Ik zal het eenvoudig maken,
- Importeren en exporteren zijn ES6-functies (Next gen JS).
- Vereist is een ouderwetse methode om code uit andere bestanden te importeren
Groot verschil zit in de vereiste, het gehele JS-bestand wordt aangeroepen of geïmporteerd. Zelfs als je een deel ervan niet nodig hebt.
var myObject = require('./otherFile.js'); //This JS file will be imported fully.
Terwijl u bij het importeren alleen objecten/functies/variabelen kunt extraheren die vereist zijn.
import { getDate }from './utils.js';
//Here I am only pulling getDate method from the file instead of importing full file
Een ander groot verschil is dat je require
overal in het programma kunt gebruiken waar import
altijd bovenaan het bestand moet staan
Bewerken: in de nieuwste knooppuntversies kunt u destructuring gebruiken. Het ziet er zo uit
const { getDate } = require('./date.js');
Antwoord 5, autoriteit 3%
nieuwe ES6:
‘import’ moet worden gebruikt met ‘export’ sleutelwoorden om variabelen/arrays/objecten te delen tussen js-bestanden:
export default myObject;
//....in another file
import myObject from './otherFile.js';
old skool:
‘require’ moet worden gebruikt met ‘module.exports’
module.exports = myObject;
//....in another file
var myObject = require('./otherFile.js');