TL; DR - Yapma, ~ Ekim 2019 tarihine kadar. Node.js Modüller Ekibi şunları sordu :
Lütfen [Ekim 2019] tarihine kadar Node.js tarafından kullanılması amaçlanan ES modül paketlerini yayınlamayın
2019 Mayıs güncelleme
Bu sorunun sorulduğu 2015'ten bu yana, modüller için JavaScript desteği önemli ölçüde olgunlaştı ve umarım Ekim 2019'da resmi olarak kararlı olacak. Diğer tüm cevaplar artık eski veya aşırı derecede karmaşık. İşte mevcut durum ve en iyi uygulama.
ES6 desteği
ES6'nın% 99'u (aka 2015) Düğüm tarafından sürüm 6'dan beri desteklenmektedir . Düğümün şu anki sürümü 12'dir. Tüm yaprak dökmeyen tarayıcılar ES6 özelliklerinin büyük çoğunluğunu destekler. ECMAScript şimdi 2019 sürümündedir ve sürüm düzeni artık yılların kullanılmasını desteklemektedir.
Tarayıcılarda ES Modülleri (diğer adıyla ECMAScript modülleri)
Tüm dökmeyen tarayıcılar edilmiştir destekleyen import
2017 yılından bu yana -ing ES6 modüllerini Dinamik ithalatı vardır desteklenen Chrome tarafından ve Safari (Opera ve Samsung internet gibi + çatal). Bir sonraki sürüm olan 67 için Firefox desteği destekleniyor.
Artık gerek yük modülleri WebPack / toplaması / Parsel vb. Yine de başka amaçlar için yararlı olabilirler, ancak kodunuzu yüklemeniz gerekmez. ES modülleri kodunu gösteren URL'leri doğrudan içe aktarabilirsiniz.
Düğümdeki ES modülleri
ES modülleri ( .mjs
ile dosyaları import
/ ' export
) arayarak Düğüm v8.5.0 beri destekleniyor node
ile --experimental-modules
bayrak. Nisan 2019'da yayınlanan düğüm v12, deneysel modül desteğini yeniden yazdı. En görünür değişiklik, içe aktarma sırasında dosya uzantısının varsayılan olarak belirtilmesi gerektiğidir:
// lib.mjs
export const hello = 'Hello world!';
// index.mjs:
import { hello } from './lib.mjs';
console.log(hello);
.mjs
Boyunca zorunlu uzantılara dikkat edin. Olarak çalıştırmak:
node --experimental-modules index.mjs
Düğüm 12 sürümü aynı zamanda Modüller Ekibi , geliştiricilerin hem ve aracılığıyla paketleri kullanmak için bir çözüm bulunana kadar Node.js tarafından kullanılması amaçlanan ES modül paketlerini yayınlamamasını istediğinde gerçekleşir . Tarayıcılar için tasarlanmış yerel ES modüllerini yine de yayınlayabilirsiniz.require('pkg')
import 'pkg'
Yerel ES modüllerinin ekosistem desteği
Mayıs 2019'dan itibaren ES Modülleri için ekosistem desteği olgunlaşmamış durumda. Örneğin, Jest ve Ava gibi test çerçeveleri desteklemiyor --experimental-modules
. Bir transpiler kullanmanız gerekir ve daha sonra adlandırılmış import ( import { symbol }
) sözdizimini (henüz çoğu npm paketiyle çalışmaz) ve çalışan varsayılan içe aktarım sözdizimi ( import Package from 'package'
) ile Babel ayrıştırdığında kullanılamaz. TypeScript'te yazılmış paketler için (graphql-tools, node-flux, faast vb.) --experimental-modules
Babil kodunuzu aktarır ve Jest / Ava / Mocha vb. ile test edebilmeniz için çalışır.
import * as ApolloServerM from 'apollo-server'; const ApolloServer = ApolloServerM.default || ApolloServerM;
Tartışmasız çirkin, ama bu şekilde kendi ES modülleri kodunu import
/ ile yazabilir export
ve node --experimental-modules
transpiller olmadan çalıştırabilirsiniz. Henüz ESM'ye hazır olmayan bağımlılıklarınız varsa, bunları yukarıdaki gibi içe aktarın ve Babel aracılığıyla test çerçevelerini ve diğer araçları kullanabilirsiniz.
Sorunun önceki cevabı - Unutmayın, Node Ekim 2019 civarında, ihtiyaç / içe aktarma sorununu çözene kadar bunu yapmayın.
ES6 modüllerini geriye dönük uyumlulukla npm'de yayınlama
O Babel veya diğer transpilers olmadan doğrudan alınabilir, böylece npmjs.org bir ES modülünü yayımlamak için, sadece işaret main
senin alanına package.json
göre .mjs
dosyanın, ancak uzantısını ihmal:
{
"name": "mjs-example",
"main": "index"
}
Tek değişiklik bu. Uzantıyı atlayarak, Düğüm --experimental-modules ile çalıştırılırsa önce bir mjs dosyası arar. Aksi takdirde .js dosyasına geri döner, bu nedenle eski Düğüm sürümlerini desteklemek için mevcut transpilasyon işleminiz daha önce olduğu gibi çalışır - Babel'i dosyalara yönlendirdiğinizden emin olun .mjs
.
İşte Düğüm <8.5.0 için geriye dönük uyumluluk ile bir yerli ES modülü için kaynak ben NPM yayınlanır ki. Babil veya başka bir şey olmadan hemen kullanabilirsiniz.
Modülü takın:
npm install local-iso-dt
# or, yarn add local-iso-dt
Bir test dosyası test.mjs oluşturun :
import { localISOdt } from 'local-iso-dt/index.mjs';
console.log(localISOdt(), 'Starting job...');
Düğümü (v8.5.0 +) - deneysel modüller bayrağıyla çalıştırın:
node --experimental-modules test.mjs
daktilo ile yazılmış yazı
TypeScript'te geliştirirseniz, ES6 kodu oluşturabilir ve ES6 modüllerini kullanabilirsiniz:
tsc index.js --target es6 --modules es2015
Sonra, yeniden adlandırmak gerekir *.js
çıktı .mjs
, bilinen bir sorunu umarım çok yakında sabit alacak tsc
kutu çıktı .mjs
doğrudan dosyaları.