Korzystanie Z Węzła.js require vs. ES6 import / eksport

W projekcie, nad którym współpracuję, mamy dwie możliwości wyboru systemu modułów:]}

  1. Importowanie modułów za pomocą require i eksportowanie za pomocą module.exports i exports.foo.
  2. Importowanie modułów za pomocą ES6 import i eksportowanie za pomocą ES6 export

Czy są jakieś korzyści wydajnościowe z używania jednego nad drugim? Czy jest coś jeszcze, co powinniśmy wiedzieć, jeśli będziemy używać modułów ES6 zamiast węzłów?

Author: sepehr, 2015-07-11

7 answers

Czy są jakieś korzyści wydajnościowe z używania jednego nad drugim?

Należy pamiętać, że nie istnieje jeszcze silnik JavaScript, który natywnie obsługuje moduły ES6. Sam powiedziałeś, że używasz Babel. Babel konwertuje import i export deklarację do CommonJS (require/module.exports) domyślnie tak. Więc nawet jeśli używasz składni modułu ES6, będziesz używać CommonJS pod maską, jeśli uruchomisz kod w węźle.

Istnieją techniczne różnice między CommonJS a ES6 Moduły, np. CommonJS pozwala na dynamiczne ładowanie modułów. ES6 nie pozwala na to, , ale istnieje API w rozwoju dla tego.

Ponieważ moduły ES6 są częścią standardu, użyłbym ich.

 509
Author: Felix Kling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-03 10:11:19

Istnieje kilka zastosowań / możliwości, które warto rozważyć:

Require:

  • możesz mieć dynamiczne ładowanie tam, gdzie załadowana Nazwa modułu nie jest predefiniowane / statyczne, lub gdy warunkowo wczytujesz moduł tylko wtedy, gdy jest to " naprawdę wymagane "(w zależności od pewnego przepływu kodu).
  • ładowanie jest synchroniczne. Oznacza to, że jeśli masz wiele require s, są one ładowane i przetwarzane jeden po drugim.

ES6 Import:

  • możesz użyć nazwane import do selektywnie załaduj tylko potrzebne elementy. To może oszczędzaj pamięć.
  • Import może być asynchroniczny (a w aktualnym czytniku modułów ES6 jest) i może działać trochę lepiej.

Ponadto system Require module nie jest oparty na standardach. Jest bardzo mało prawdopodobne, aby stać się standardem teraz, gdy istnieją Moduły ES6. W przyszłości pojawi się natywne wsparcie dla modułów ES6 w różnych implementacjach, które będzie korzystne pod względem wydajności.

 108
Author: Amit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-11 14:40:46

Główne zalety to składnia:

  • składnia bardziej deklaratywna / zwarta
  • moduły ES6 zasadniczo sprawią, że UMD (Universal Module Definition) stanie się przestarzały - zasadniczo usunie schizmę między CommonJS i AMD (server vs browser).

Jest mało prawdopodobne, aby zobaczyć jakiekolwiek korzyści z wydajności z modułów ES6. Nadal będziesz potrzebować dodatkowej biblioteki do spakowania modułów, nawet jeśli w przeglądarce jest pełna obsługa funkcji ES6.

 32
Author: snozza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-04 09:21:50

Czy są jakieś korzyści wydajnościowe z używania jednego nad drugim?

Obecna odpowiedź brzmi nie, ponieważ żaden z obecnych silników przeglądarki nie implementuje import/export ze standardu ES6.

Niektóre wykresy porównawcze http://kangax.github.io/compat-table/es6 / Nie bierz tego pod uwagę, więc gdy widzisz prawie wszystkie zielenie dla Chrome, po prostu uważaj. import słowo kluczowe z ES6 nie zostało wzięte pod uwagę.

Innymi słowy, bieżąca przeglądarka silniki, w tym V8, nie mogą importować nowego pliku JavaScriptz głównego pliku JavaScript poprzez dowolną dyrektywę JavaScript.

( możemy być jeszcze tylko o kilka błędów lub o wiele lat, dopóki V8 Nie zaimplementuje tego zgodnie ze specyfikacją ES6. )

Ten dokument jest tym, czego potrzebujemy, a ten dokument jest tym, czego musimy przestrzegać.

A standard ES6 mówi, że zależności modułów powinny tam być zanim przeczytamy moduł podobnie jak w języku programowania C, gdzie mieliśmy pliki (nagłówki) .h.

Jest to dobra i dobrze przetestowana struktura i jestem pewien, że eksperci, którzy stworzyli standard ES6, mieli to na myśli.

To pozwala Webpackowi lub innym pakietom zoptymalizować pakiet w niektórych specjalnych przypadkach i zmniejszyć niektóre zależności od pakietu, które nie są potrzebne. Ale w przypadkach, gdy mamy doskonałe zależności, To nigdy się nie wydarzy.

Będzie potrzebował trochę czasu dopóki import/export natywne wsparcie nie zostanie uruchomione, a słowo kluczowe require nie zniknie przez długi czas.

Co to jest require?

To jest node.js Sposób ładowania modułów. ( https://github.com/nodejs/node )

Node używa metod systemowych do odczytu plików. Zasadniczo polegasz na tym używając require. require zakończy się wywołaniem systemowym, takim jak uv_fs_open (zależy od systemu końcowego, Linux, Mac, Windows), aby załadować plik/moduł JavaScript.

Aby sprawdzić, czy to prawda, spróbuj by użyć Babel.js, a zobaczysz, że słowo kluczowe import zostanie przekonwertowane na require.

Tutaj wpisz opis obrazka

 23
Author: prosti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-29 23:52:22

Używanie modułów ES6 może być przydatne do "tree potrząsania"; tzn. umożliwienie Webpack 2, Rollup (lub innych bundlerów) identyfikacji ścieżek kodu, które nie są używane/importowane, a zatem nie trafiają do wynikowego pakietu. Może to znacznie zmniejszyć rozmiar pliku, eliminując kod, którego nigdy nie potrzebujesz, ale z CommonJS jest domyślnie dołączony, ponieważ Webpack et al nie mają sposobu, aby wiedzieć, czy jest potrzebny.

Odbywa się to za pomocą statycznej analizy ścieżki kodu.

Na przykład, użycie:

import { somePart } 'of/a/package';

... daje bundlerowi wskazówkę, że package.anotherPart nie jest wymagany (jeśli nie jest importowany, nie może być używany - prawda?), więc nie będzie to kłopotliwe.

Aby włączyć to dla Webpack 2, Musisz upewnić się, że Twój transpiler nie wypluwa modułów CommonJS. Jeśli używasz wtyczki es2015 z babel, możesz ją wyłączyć w swoim .babelrc w następujący sposób:

{
  "presets": [
    ["es2015", { modules: false }],
  ]
}

Rollup i inne mogą działać inaczej-Przejrzyj dokumenty, jeśli jesteś zainteresowany.

 17
Author: Lee Benson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-27 15:45:01

Jeśli chodzi o asynchroniczne lub leniwe Ładowanie, to import () jest znacznie potężniejsze. Zobacz kiedy wymagamy komponentu w sposób asynchroniczny, wtedy tylko importujemy go w sposób asynchroniczny jak w zmiennej const.

const module = await import('./module.js');

Lub jeśli chcesz użyć require() wtedy,

const converter = require('./converter');

Rzecz w tym, że import() jest w naturze asynchroniczna. Jak wspomniał neehar venugopal w ReactConf, można go używać do dynamicznego ładowania komponentów.

Jest również o wiele lepiej, jeśli chodzi o Routing. That is the one special rzecz, która sprawia, że dziennik sieciowy, aby pobrać niezbędną część, gdy użytkownik łączy się z określoną witryną do określonego komponentu. np. strona logowania przed pulpitem nawigacyjnym Nie pobierze wszystkich komponentów Pulpitu nawigacyjnego. Ponieważ to, co jest potrzebne, czyli komponent logowania, który tylko zostanie pobrany.

Uwaga - jeśli rozwijasz węzeł.js project, wtedy musisz ściśle używać require(), ponieważ node wyrzuci błąd wyjątku jako invalid token 'import', jeśli użyjesz import. Więc node nie obsługuje importu statements

UPDATE-jak zasugerował Dan Dascalescu : od wersji 8.5.0 (wydanej we wrześniu 2017), node --experimemntal-modules index.mjs pozwala używać import bez Babel. Możesz (i powinieneś) również opublikować swoje pakiety npm jako natywny ESModule, ze wsteczną kompatybilnością dla starego require.

Zobacz to, aby uzyskać więcej informacji, gdzie używać importu asynchronicznego- https://www.youtube.com/watch?v=bb6RCrDaxhw

 5
Author: Meet Zaveri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-27 03:35:53

Osobiście używam importu, ponieważ, możemy importować wymagane metody, członków za pomocą import.

import {foo, bar} from "dep";

nazwa pliku: dep.js

export foo function(){};
export const bar = 22
Zasługa Paula Shana. Więcej informacji .
 3
Author: chandoo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-22 07:04:33