Düğüm 13.2.0 ve Üstü
NodeJS 13.2.0 artık bayraksız ES Modüllerini desteklemektedir 🎉 Bununla birlikte, uygulama hala deneysel olarak işaretlenmiştir, bu nedenle üretimde dikkatli kullanılmalıdır.
13.2.0'da ESM desteğini etkinleştirmek için aşağıdakileri ekleyin package.json
:
{
"type": "module"
}
Tüm .js
, .mjs
(veya bir uzantısı olmadan dosyaları) ESM olarak ele alınacaktır.
package.json
Tüm katılım dışında, hepsi 13.2.0 Dokümantasyonunda ayrıntılı olarak açıklanan bir dizi farklı seçenek vardır .
Düğüm 13.1.0 ve Altı
Hala Node'un eski sürümlerini kullananlar , NodeJS için ES Modülleri Spesifikasyonunun üretime hazır bir uygulaması olan esm modülü yükleyicisini denemek isteyebilir:
node -r esm main.js
Ayrıntılı Güncellemeler ...
23 Nisan 2019
Yakın zamanda bir PR, ES Modüllerinin tespit edilme şeklini değiştirmek için indi:
https://github.com/nodejs/node/pull/26745
Hala --experimental-modules
bayrağın arkasında , ancak modüllerin yüklenme biçiminde büyük değişiklikler var:
package.type
ya module
da olabilircommonjs
type: "commonjs"
:
.js
ortak olarak ayrıştırılır
- uzantısı olmayan giriş noktası için varsayılan ortak değerdir.
type: "module"
:
.js
esm olarak ayrıştırılır
- varsayılan olarak JSON veya Yerel Modül'ün yüklenmesini desteklemez
- uzantısı olmayan giriş noktası için varsayılan değer esm'dir
--type=[mode]
türü giriş noktasında ayarlamanızı sağlar. package.type
Giriş noktası için geçersiz kılınır .
- Yeni bir dosya uzantısı
.cjs
.
- bu özellikle ortak
module
modların içe aktarılmasını desteklemek içindir .
- bu sadece esm yükleyicide, commonjs yükleyiciye dokunulmaz, ancak tam dosya yolunu kullanırsanız uzantı eski yükleyicide çalışır.
--es-module-specifier-resolution=[type]
- seçenekler
explicit
(varsayılan) venode
- varsayılan olarak yükleyicimiz içe aktarmada isteğe bağlı uzantılara izin vermez, varsa modülün yolu uzantıyı içermelidir
- varsayılan olarak yükleyicimiz dizin dosyası olan dizinlerin içe aktarılmasına izin vermez
- geliştiriciler
--es-module-specifier-resolution=node
commonjs belirleyici çözünürlük algoritmasını etkinleştirmek için kullanabilir
- Bu bir “özellik” değil, deneme amaçlı bir uygulamadır. Bayrak kaldırılmadan önce değişmesi bekleniyor
--experimental-json-loader
- json'u içe aktarmanın tek yolu
"type": "module"
- ne zaman tüm
import 'thing.json'
moddan bağımsız deneysel yükleyici geçecek
- whatwg / html # 4315 tabanlı
package.main
Bir modül için bir giriş noktası ayarlamak için
kullanabilirsiniz
- esas olarak kullanılan dosya uzantıları modülün türüne göre çözülecektir
17 Ocak 2019
Düğüm 11.6.0 , ES Modüllerini hala bir bayrağın arkasında deneysel olarak listeliyor.
13 Eylül 2017
NodeJS 8.5.0 , bir bayrağın arkasındaki mjs dosyaları desteği ile piyasaya sürüldü:
node --experimental-modules index.mjs
Bunun planı v10.0 LTS sürümünün bayrağını kaldırmaktır.
--Outdated Bilgi. Burada tarihi amaçlar için saklandım ...
8 Eylül 2017
NodeJS ana dalı ESM modülleri için ilk destekle güncellendi:
https://github.com/nodejs/node/commit/c8a389e19f172edbada83f59944cad7cc802d9d5
Bu en son gece mevcut olmalıdır ( mevcut kurulumunuzla birlikte çalıştırmak için nvm üzerinden kurulabilir):
https://nodejs.org/download/nightly/
Ve --experimental-modules
bayrağın arkasında etkin :
package.json
{
"name": "testing-mjs",
"version": "1.0.0",
"description": "",
"main": "index.mjs" <-- Set this to be an mjs file
}
O zaman koş:
node --experimental-modules .
Şubat 2017:
https://medium.com/@jasnell/an-update-on-es6-modules-in-node-js-42c958b890c#.6ye7mtn37
NodeJS çocuklar en az kötü çözümün .mjs
dosya uzantısını kullanmak olduğuna karar verdiler . Bu paket servisi olan restoran:
Başka bir deyişle, iki dosya verilen foo.js
ve bar.mjs
kullanarak import *
from 'foo'
, foo.js
CommonJS olarak ele import * from 'bar'
alacakbar.mjs
bir ES6 Modülü olarak
Ve zaman çizelgelerine gelince ...
Şu an için, Node.js'nin ES6 modüllerinin desteklenebilir bir uygulamasını geliştirmeye başlayabilmesi için ES6 ve Sanal Makine tarafında olması gereken bazı şartname ve uygulama sorunları var. İşler sürüyor ama biraz zaman alacak - Şu anda en azından bir yıla bakıyoruz .
Ekim 2016:
Node.JS'deki geliştiricilerden biri kısa süre önce bir TC-39 toplantısına katıldı ve Node.JS için uygulama yapmak için engelleyiciler hakkında mükemmel bir makale yazdı:
https://hackernoon.com/node-js-tc-39-and-modules-a1118aecf95e
Bundan temel kalkış:
- ES Modülleri statik olarak analiz edilir, CommonJS değerlendirilir
- CommonJS modülleri maymun yama ihracatına izin verir, ES Modülleri şu anda
- Bir ES Modülü'nün ne olduğunu ve bir tür kullanıcı girişi olmadan CommonJS'nin ne olduğunu tespit etmek zordur, ancak deniyorlar.
*.mjs
kullanıcı girişi olmadan bir ES Modülünü doğru bir şekilde algılayamadıkları sürece en olası çözüm gibi görünüyor
- Orijinal Yanıt -
Bu oldukça uzun bir süredir sıcak patates oldu. Büyük olasılıkla ne zaman - Alt çizgi evet Düğüm sonunda modülleri / ithal ihracat için ES2015 sözdizimi destekleyecek olmasıdır yükleme modülleri için Spec kesinleşmiş ve kabul görmektedir.
İşte NodeJS'yi neyin desteklediğine dair iyi bir genel bakış . Esasen, yeni spesifikasyonun öncelikle koşullu, senkronize yükleme ve ayrıca asenkronize olan HTML olan Node için çalıştığından emin olmaları gerekir.
Kimse şu anda kesin olarak bilmiyor, ancak Node'un dinamik yükleme için yenisine import/export
ek olarak statik yüklemeyi destekleyeceğini hayal ediyorum System.import
- hala require
eski kodu korurken .
Düğümün bunu nasıl başarabileceğine dair birkaç öneri:
node es2015 modules
, aşağıdakileri en iyi sonuçlardan biri olarak gösterir: github.com/nodejs/node/wiki/ES6-Module-Detection-in-Node .