NodeJS, ithalat / ihracat es6 (es2015) modüllerini desteklemeyi planlıyor


275

Bunun için net bir cevap almadan internetin her yerine bakıyordum.

Şu anda NodeJS, modülleri yüklemek için yalnızca CommonJS sözdizimini kullanır ve standart ES2015 modülleri sözdizimini gerçekten kullanmak istiyorsanız, bunu önceden aktarmanız veya çalışma zamanında harici bir modül yükleyici kullanmanız gerekir.

Şu anda bu iki yöntemden birini kullanmak için çok olumlu değilim, NodeJS sahipleri ES2015 modüllerini desteklemeyi planlıyorlar mı, değil mi? Bununla ilgili hiç bir ipucu bulamadım.

Şu anda NodeJS 6.x, ES2015 özelliklerinin% 96'sını desteklediğini iddia ediyor, ancak modüllere herhangi bir referans yok ( NodeJS ES2105 destek bağlantısı ).

NodeJS'nin bu modülleri yakın gelecekte destekleyip desteklemeyeceğini biliyor musunuz?


2
İçin googlingnode es2015 modules , aşağıdakileri en iyi sonuçlardan biri olarak gösterir: github.com/nodejs/node/wiki/ES6-Module-Detection-in-Node .
Felix Kling

6
Şahsen bu soruyu "çok yerelleştirilmiş" olarak kapatmak için oy kullanardım, ancak bu yakın sebep artık mevcut değil. Diyelim ki Düğüm yarın ES6 modüllerini uygulamayı başardı. O zaman sorunuzu silecek misiniz, çünkü artık alakalı değil mi? Yoksa en azından güncelleyecek misin? Zaten eski veya "yakında" güncellenmesi gerektiğini biliyorsanız zaten bir soru SO için uygun olduğunu sanmıyorum. Ama bu sadece benim görüşüm ve tam tersini düşünen başkaları var gibi görünüyor, ki benim için uygun :) (fwiw, kendi başına soru elbette önemli ve ilginç)
Felix Kling

2
Yine de Stack Universe'de böyle sorular için bir yer olsaydı. Buraya teknik olarak uygun olmayabilir, ama bunun gerçekten "görüşe dayalı" olduğuna katıldığımı bilmiyorum. OP, belirli bir soruya belirli bir cevap arıyor, ancak (bir noktada) modası geçmiş bir soru arıyor.
Wonko the Sane

5
Bu sorunun alternatif ifadeleri: "ES6 modülleri için node.js desteğinin durumu nedir?" Teknoloji geliştikçe birçok SO sorunun cevabı zamanla değişir. Buraya inene kadar cevabı bulmakta da zorlandım.
Joe Lapp

4
@FelixKling Sanırım bu soruyu kapatmak isteyen çok yanlış bir karar olurdu çünkü şu ana kadar oy kullanacak kadar 211 kişi sorunlu bulundu.
Muhammed Umer

Yanıtlar:


302

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.jsonTü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-modulesbayrağın arkasında , ancak modüllerin yüklenme biçiminde büyük değişiklikler var:

  • package.typeya moduleda 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.typeGiriş noktası için geçersiz kılınır .
  • Yeni bir dosya uzantısı .cjs.
    • bu özellikle ortak modulemodları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=nodecommonjs 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.mainBir 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-modulesbayrağı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 .mjsdosya uzantısını kullanmak olduğuna karar verdiler . Bu paket servisi olan restoran:

Başka bir deyişle, iki dosya verilen foo.jsve bar.mjskullanarak import * from 'foo', foo.jsCommonJS 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/exportek olarak statik yüklemeyi destekleyeceğini hayal ediyorum System.import- hala requireeski kodu korurken .

Düğümün bunu nasıl başarabileceğine dair birkaç öneri:


38
Hakkında .mjsuzantısı: We have affectionately called these “Michael Jackson Script” files in the past. JS konuşması sırasında birinin pop sanatçıları hakkında konuştuğunu duymanız durumunda.
Jeewes

1
İçe aktarım sözdiziminin değiştirilmesinin neden yeterli olmadığını görmüyorum. Es ('doğru' bir) içe aktarma için bir sözdizimi ve cjs içe aktarma için bir sözdizimi mi? Diğer bir deyişle, foo.js ve bar.js adlı iki dosya verildiğinde, import * from 'foo'foo.js'yi CommonJS import * as bar from 'bar'bar.js'yi ES6 Modülü olarak ele alacağı için ele alır.
Corey Alix

1
@CoreyAlix Sözdizimi bir ortamı desteklemek için genellikle değiştirilmez. Bu gerçekten sadece Düğümü etkiler. Ayrıca, sözdizimi biraz sezgisel değildir. Önerilen sözdizimindeki dışa aktarmalara nasıl erişirim?
CodingIntrigue

Açıkça söylemek gerekirse, "benim" teklifim değil, halihazırda hangi yazının yapıldığını kopyalıyorum. Sorunuzu yanıtlamak için dışa aktarma işlemine "bar" ile erişirsiniz: bar.foobar () import {foo as Foo}, "./foo" adresinden bir ES6 modülünü tanımlamak için kullanılan mekanizmadır. var Foo = requir (“./ foo”), CJS modülünü tanımlamak için kullanılan mekanizmadır. Typescript'te commonjs çıktısı şöyle görünür: var mod1_1 = requir ("./ mod1"); export.mod1 = mod1; ES6 çıktısı şuna benzer: {mod1} dosyasını “./mod1” den içe aktarın; ihracat {mod1}
Corey Alix

1
Bu cevaba yapılan bir Node 10 güncellemesinde gerçekten ilginç olurum. Özellik kesimi yaptı mı yoksa hala bir bayrağın arkasında mı?
dcorking
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.