Jest: Harap pertimbangkan untuk menambahkan dukungan asli untuk modul ES

Dibuat pada 5 Nov 2017  ·  81Komentar  ·  Sumber: facebook/jest

Apakah Anda ingin meminta fitur atau melaporkan bug ?
Saya ingin meminta fitur.
Apa perilaku saat ini?
Saat ini Jest tidak mendukung suite pengujian dengan pernyataan import . Mereka menghasilkan kesalahan berikut:

SyntaxError: Unexpected token import

      at ScriptTransformer._transformAndBuildScript (node_modules/jest-runtime/build/script_transformer.js:305:17)
          at Generator.next (<anonymous>)
          at new Promise (<anonymous>)

Apa perilaku yang diharapkan?
Akan lebih bagus jika Jest mendukung modul ES secara asli.

Harap berikan konfigurasi Jest Anda yang tepat dan sebutkan Jest, node, versi yarn/npm dan sistem operasi Anda.
Lelucon: 21.2.1
simpul: 8.9.0
npm: 5.5.1

Sebelumnya, dukungan asli modul ES tidak dimungkinkan karena node.js tidak mendukungnya. Mulai dari beberapa versi yang lalu, node.js menambahkan dukungan modul ES dengan flag (https://nodejs.org/api/esm.html). Akan sangat bagus jika Jest akan mencocokkan ini dengan menambahkan dukungan modul ES juga, mungkin dengan bendera atau bahkan tanpanya.

Node.js membutuhkan modul ES untuk memiliki ekstensi .mjs . Untuk mendukung modul ES, Jest perlu menambahkan pengenalan ekstensi tersebut. Jest juga perlu meneruskan flag --experimental-modules ke node.js hingga node mengimplementasikan dukungan modul tanpa flag. Saya tidak yakin apakah ada perubahan lain yang diperlukan dalam Jest untuk mendukung ini. Saya hanya bisa berharap itu tidak akan terlalu sulit.

Idealnya, akan keren jika Jest mengenali modul bahkan dalam file tanpa ekstensi .mjs karena kode yang menargetkan browser tidak menggunakannya, tetapi saya tidak tahu apakah itu mungkin. Node.js menyediakan kait pemuat untuk itu (https://nodejs.org/api/esm.html) tetapi ini masih tidak menyelesaikan masalah dengan penentuan yang andal tentang jenis modul apa file itu.

Saya percaya modul ES adalah fitur hebat yang jauh lebih unggul daripada semua solusi modul JS yang ada. Menerapkannya di node.js membuka pintu bagi Jest untuk memilikinya juga. Ini akan memungkinkan pengembang tetap menggunakan format modul JS standar pertama yang benar-benar tidak hanya selama pengembangan, tetapi juga melalui pengujian.

Discussion ES Modules

Komentar yang paling membantu

Mungkin hanya perlu beberapa penyesuaian tentang bagaimana Jest memanfaatkan CJS. Misalnya ketika mengejek objek module , alih-alih menggunakan objek biasa, itu bisa menggunakan require("module") dan kemudian membungkus/menimpa module.require untuk mencegat permintaan dan menyulap sesuai kebutuhan.

Memperbarui:

Saya sekarang sedang bekerja untuk mengaktifkan Jest di luar kotak dengan esm (semoga tidak ada yang dilakukan Jest secara berbeda) . Saya akan terus bereksperimen selama akhir pekan tetapi tanda-tanda awal terlihat bagus.

Semua 81 komentar

Jest memiliki implementasi require (https://github.com/facebook/jest/blob/master/packages/jest-runtime/src/index.js), jadi itu akan jauh lebih terlibat daripada hanya mendukung sintaks dan default untuk melihat .mjs . Saya juga menentang pengaktifan flag eksperimental.

Dimungkinkan untuk secara otomatis mengubah import / export , tetapi menerapkan semantik adalah pekerjaan besar, dan mungkin diblokir selama satu tahun karena dukungan untuk node 6.

Saya setuju dengan SimenB. Kami membutuhkan sejumlah kait dari tim simpul untuk dapat membuat ini bekerja bersama dengan modul vm. Namun, saya pikir kita harus mendukung ini untuk sementara, tetapi tidak dengan mencerminkan implementasi asli penuh melainkan dengan menggunakan babel dan mengkompilasinya ke dalam babel-jest . Saya pikir untuk tujuan pengujian ini akan berfungsi dengan baik dan kami tidak harus memberikan jaminan yang sama yang harus disediakan oleh runtime node.

Jadi hanya menambahkan babel-plugin-transform-es2015-modules-commonjs & babel-plugin-dynamic-import-node ke babel-jest ?

Ya, itulah yang saya pikirkan.

Kawan, bagaimana dengan mengintegrasikan https://github.com/standard-things/esm ? Ini cepat dan mempertahankan banyak kasus tepi.

@TrySound akan terlihat seperti apa secara konkret? Bisakah Anda membuat prototipe?

Kami masih memiliki implementasi kebutuhan kami sendiri (diperlukan untuk tiruan), jadi saya rasa itu tidak akan banyak membantu.

Dan kita perlu bekerja dengan aturan Node dan aturan browser.

Saya akan sangat senang untuk dikoreksi dan membuatnya bekerja dengan sempurna untuk kami :D

@std/esm tampaknya hanya berfungsi dengan lelucon: https://twitter.com/jdalton/status/930257653292400640

Adakah yang bisa mencobanya dan kembali dengan PR untuk dokumen? 🙂

Saya kira pengguna ingin memiliki dukungan di mana-mana, tetapi saya menemukan itu hanya berfungsi untuk dependensi file uji.

// test.js
require = require('@std/esm')(module, { esm: 'js', cjs: true });
const utils = require('./utils');
// utils.js
export { default as update } from './update';

Itu lebih baik, tetapi tidak ideal.

Jadi hanya menambahkan babel-plugin-transform-es2015-modules-commonjs & babel-plugin-dynamic-import-node ke babel-jest?

Saya tidak berpikir ini adalah solusi yang bagus, karena tidak melakukan pemeriksaan "ekspor yang hilang" yang sangat berharga dengan modul ES. Misalnya, di React repo saya mulai menjalankan build lebih sering hanya karena Rollup menemukan kesalahan ini tetapi Jest dengan es2015-modules-commonjs tidak.

@std/esm tampaknya hanya bekerja dengan lelucon

Akan sangat bagus untuk menginvestasikan waktu ke dalam interop mereka. Cukup yakin solusi peretasan ini pada akhirnya akan rusak: https://stackoverflow.com/questions/46433678/specify-code-to-run-before-any-jest-setup-happens . Tetapi jika itu hanya masalah mengekspos sesuatu di sisi Jest, akan keren untuk melihatnya didukung.

@SimenB , menurut saya langkah langsungnya tidak akan terlalu rumit. Yang mendesak adalah mengizinkan orang untuk bekerja dengan modul .mjs, bahkan jika babel membantu di balik layar pengujian. Jika tidak, orang mungkin harus menemukan solusi pengujian yang berbeda jika mereka ingin menggunakan .mjs.

  1. Perbaiki properti testMatch agar file .mjs dapat ditemukan
    (saat ini tidak berfungsi bahkan regex tampaknya sudah benar, mungkin ada kode keras di suatu tempat yang menolak ekstensi .mjs)
  2. Lewati flag --experimental-modules saat menjalankan node.js sehingga akan berjalan secara native
  3. Jest harus memperlakukan .mjs dengan cara yang sama persis seperti .js hari ini (mis. dalam persyaratan lelucon) -- pernyataan impor sudah diizinkan di dalam .js hari ini, jadi hanya perlu mengizinkan ekstensi .mjs.

Solusi terakhir mungkin rumit dan membutuhkan waktu, tetapi itu tidak bisa dihindari bukan?

Halo, apakah ada yang bisa memperbaiki kesalahan ini?

Kami menggunakan .mjs dengan opsi "node --experimental-modules". Ada solusi?

Kami menggunakan .mjs dengan opsi "node --experimental-modules". Ada solusi?

Itu eksperimental dan tidak sepenuhnya disempurnakan. Masih banyak churn dengan hal-hal mendasar, seperti cara mengimpor modul bawaan, masih belum terjawab. Proyek seperti AVA telah mulai mengizinkan penggunaan @std/esm sebagai saluran pemuatnya jika digunakan (melewati Babel). Mungkin lelucon bisa mengambil pendekatan serupa.

Mendukung @std/esm adalah sesuatu yang ingin kami lakukan, bantuan untuk mengimplementasikannya sangat kami harapkan!

@SimenB Bisakah Anda mengobrol kapan saja di hangout?

Hi @SimenB 👋

Seorang pengguna esm telah berkontribusi esm + Demo lelucon dan saya pikir ini mungkin merupakan titik awal yang baik untuk membuat jalur sapi yang lebih resmi.

Memperbarui:

Demo esm + Jest telah diperbarui dengan dukungan pemetaan nama modul dasar.

Itu sangat keren! Terima kasih telah berbagi.

Kita harus mencari tahu di mana kita ingin integrasi itu. Bagaimana cara menangani file CSS (atau aset non-js lainnya)? Haruskah itu hanya menjadi transformasi? Bagaimana dengan transformasi babel bawaan? Bagaimana seharusnya Jest berperilaku ketika datang ke loader yang masuk, jika itu memengaruhi apa pun?

Sepertinya mungkin ada manfaat bagi komunitas yang berkontribusi esm -enabled jest runner alternatif (atau bendera tidak resmi / eksperimental) sehingga kami dapat membuat kemajuan dalam hal seperti itu. Apakah ada minat dari tim lelucon?

require tidak diimplementasikan di runner, itu ada di runtime itu sendiri. Kontribusi apa pun untuk membuatnya dapat dipasang sangat diterima (ref #848).

Saya yakin jika Anda bisa mendapatkan contoh kode @jdalton yang ditautkan untuk bekerja tanpa masalah (atau mendekatinya), itu harus cukup sederhana untuk dimuat di esm loader di belakang bendera dalam lelucon itu sendiri. Satu hal yang saya lihat sebagai masalah adalah ia menginginkan global module , bukan yang palsu yang kita buat. Tidak yakin apakah itu berarti modul dapat bocor di antara pengujian? Saya tidak tahu apa yang dilakukan esm dengannya di bawah tenda. Itu juga tidak menangani ejekan, jadi ejekan dengan import masih akan rusak

Mungkin hanya perlu beberapa penyesuaian tentang bagaimana Jest memanfaatkan CJS. Misalnya ketika mengejek objek module , alih-alih menggunakan objek biasa, itu bisa menggunakan require("module") dan kemudian membungkus/menimpa module.require untuk mencegat permintaan dan menyulap sesuai kebutuhan.

Memperbarui:

Saya sekarang sedang bekerja untuk mengaktifkan Jest di luar kotak dengan esm (semoga tidak ada yang dilakukan Jest secara berbeda) . Saya akan terus bereksperimen selama akhir pekan tetapi tanda-tanda awal terlihat bagus.

@jdalton Adakah pembaruan dengan kompatibilitas esm ?

Hai @JasonCust , wow komentar saya mendapat perhatian!

Saya telah membuat kemajuan dalam mengidentifikasi pekerjaan yang diperlukan untuk mengaktifkan dukungan Jest di esm . Dalam eksperimen saya, saya mendapatkan tes memuat dan mengevaluasi Jest yang ditulis dalam ESM. Pekerjaan yang diperlukan pada sisi loader esm adalah membuat cara kita menangani vm.Script menggunakan lebih umum. Saat ini kami menghubungkannya terutama untuk penggunaan REPL yang mengasumsikan satu modul. Kita harus membuatnya sedikit lebih umum untuk dukungan Jest untuk diguncang. Sepertinya Jest tidak perlu mengubah apa pun. Refactor dukungan vm.Script masih dalam TODO saya dan masih akan ditangani sebelum saya merilis hal-hal seperti dukungan WASM eksperimental. Saat ini saya telah menekan bug yang muncul di sekitar peningkatan APM dan dukungan mengejek.

Terima kasih atas pembaruannya @jdalton karena saya senang dapat menggunakan esm dengan Jest. Agar tidak mengganggu Anda saat mengerjakan hal tersebut, apakah ada tugas esm yang bisa kami ikuti seiring perkembangannya?

Anda dapat terus berlangganan utas ini mengikuti repo. Dukungan lelucon akan ada dalam rilis v3.1.0 sehingga Anda dapat terus memantau versi tersebut.

@jdalton Adakah berita tentang mendukung Jest di esm?

Hai @deepj!

Itu masih ada di daftar saya dan item yang bisa saya tangani sebelum menyelesaikan ini menyusut. Saya telah meningkatkan dukungan Jest tambahan untuk menguji modul esm dalam Jest _(meskipun CJS dalam tes Jest)_. Masih tidak ada implementasi yang secara kritis memblokir di sisi Jest _(jadi tidak ada pekerjaan yang harus mereka lakukan)_. Microsoft, majikan saya, adalah pengguna Jest yang berat juga, jadi ini adalah salah satu tujuan pekerjaan harian saya untuk meningkatkan ini juga. Saya berharap untuk segera mengatasinya.

@jdalton Senang mengetahuinya. Dan terima kasih atas pekerjaan Anda. Saya menghargainya!

Sangat menantikan fitur ini :speak_no_evil:

Telah mencoba membuat fitur ini berfungsi selama dua jam terakhir. Ada begitu banyak solusi parsial, jawaban setengah terdokumentasi, semuanya berbeda satu sama lain... Dulu mudah untuk menguji paket node.js.

Jadi hanya menambahkan babel-plugin-transform-es2015-modules-commonjs & babel-plugin-dynamic-import-node ke babel-jest ?

Apa yang terjadi dengan ide itu? Ada masalah dalam penerapannya?

Hai @jdalton. Saya ingin tahu apakah Anda dapat memberi tahu kami tentang status masalah ini. Maaf jika saya mengganggu Anda, tetapi saya menunggu ini sebentar, dan akan lebih baik jika kami menerima pembaruan setidaknya untuk enam bulan terakhir/ke depan. Terima kasih :)

Hai @SurenAt93!

Terima kasih atas kesabaran Anda. Saya berharap untuk merilisnya pada akhir bulan dengan dukungan Jest. Dengan itu Anda akan menentukan esm sebagai Jest transform .

Dingin. Bagaimana transformasi itu berbeda dari Babel?

@kenotron

Menggunakan opsi transform Jest adalah cara bagi saya untuk memuat samping esm loader. Jadi sementara secara teknis mengubah sumber juga, itu juga menghubungkan loader esm .

Jika pertanyaannya lebih lanjut, apa perbedaan antara Babel dan esm . Babel adalah kumpulan paket yang mengubah sumber, salah satu targetnya adalah sintaks ESM. Pemuat esm adalah pemuat ketergantungan nol yang mensimulasikan lingkungan waktu proses. Jadi esm mendukung hal-hal seperti dynamic import() , melewati spesifikasi test262 yang relevan (zona mati sementara, binding langsung, kesalahan di muka, dll.), dan mendukung pemuatan campuran CJS/ESM/WASM ke rasa dengan konfigurasi.

@jdalton Terima kasih atas kerja dan dukungannya!

@tomheller ;)

Telah mencoba membuat fitur ini berfungsi selama dua jam terakhir. Ada begitu banyak solusi parsial, jawaban setengah terdokumentasi, semuanya berbeda satu sama lain... Dulu mudah untuk menguji paket node.js.

Saya setuju.

Saya membuat proyek Vue sederhana, yang juga memanifestasikan masalahnya.
https://github.com/igasparetto/vue-jest-test
Saya tidak bisa membuatnya bekerja.

Saya mengikuti instruksi dari halaman berikut:

Mesin saya (tidak yakin itu penting):

  • Windows 10 Pro 64-bit
  • Simpul v8.9.4
  • Vue: 3.2.3
  • npm: 6.5.0

@kenotron

Menggunakan opsi transform Jest adalah cara bagi saya untuk memuat samping esm loader. Jadi sementara secara teknis mengubah sumber juga, itu juga menghubungkan loader esm .

Jika pertanyaannya lebih lanjut, apa perbedaan antara Babel dan esm . Babel adalah kumpulan paket yang mengubah sumber, salah satu targetnya adalah sintaks ESM. Pemuat esm adalah pemuat ketergantungan nol yang mensimulasikan lingkungan waktu proses. Jadi esm mendukung hal-hal seperti dynamic import() , melewati spesifikasi test262 yang relevan (zona mati sementara, binding langsung, kesalahan di muka, dll.), dan mendukung pemuatan campuran CJS/ESM/WASM ke rasa dengan konfigurasi.

@kenotron bisakah Anda memberi kami pembaruan?

@igasparetto , pekerjaan @jdalton yang seharusnya mengaktifkan ini. Saya belum mencoba solusi itu dulu.

Status terbaru di sana menurut saya adalah: https://twitter.com/jdalton/status/1080627279124934661

Ya! Maaf butuh waktu lebih lama dari yang saya inginkan. Secara lokal saya sekarang memiliki semua tes test262 yang relevan yang lulus. Dalam rangka mendapatkan itu, tes skenario terkait ejekan tergelincir jadi saya harus mengambilnya kembali sebelum saya bisa melepaskannya. Itu tidak bisa diatasi, hanya butuh sedikit waktu. Saya mempresentasikan di Covalence Conf pada 16 Januari dan berharap sudah rilis saat itu. Dalam berita lain, npm tink awal mengadopsi esm untuk dukungan sintaks ESM .

16 Januari dan berharap sudah rilis saat itu

@jdalton semoga presentasinya berjalan lancar.

Apakah Anda mendapat pembaruan tentang rilis ini?

Saya meninggalkan "titik data" kecil di sini untuk membantu Anda dalam perencanaan Anda. Saya menyadari Anda semua menyumbangkan waktu dan keterampilan Anda untuk mengatasi masalah ini. Sebagai dev sendiri, saya menghargai kontribusi Anda.

Saya baru saja menghabiskan sebagian besar kemarin, Sabtu tidak kurang, untuk mempercepat modul javascript di sisi klien dan server. ESM, CommonJS, AMD, kekacauan yang membingungkan. Saya tidak pernah bisa mendapatkan tes lelucon untuk bekerja dengan ESM memuat modul (simpul) menggunakan ekstensi .mjs. Saya dapat memuat modul yang sama dengan sukses di sisi klien. Saya bisa membuat simpul "klien" yang menggunakan modul dengan pernyataan impor. Saya tidak dapat mengonfigurasi lelucon dengan benar untuk menggunakan pernyataan impor yang sama, dengan atau tanpa babel, dengan atau tanpa esm. Saya akhirnya beralih ke ava, dan baru saja berhasil mengikuti resep di situs web mereka. Ya, saya mengikuti resep, saya tidak sepenuhnya memahami mesin yang membuat semua bagian bekerja. Tapi setidaknya saya sekarang bisa menulis ESM memuat modul javascript dan tes unit terkait. Menurut saya. Saya memperkirakan atas dasar satu keberhasilan. Mereka juga memiliki resep untuk menghubungkan ava ke webstorm. Tapi setidaknya mereka menyajikan resep untuk manusia biasa seperti saya.

Saya juga menyadari pesan ini akan terbaca seperti saya sedang merengek (yang sebagian adalah saya). Saya melihat semua pekerjaan yang menjadi lelucon. Tapi dukungan ESM ini adalah pembunuh dan pemecah kesepakatan bagi saya. Kupikir Anda akan menghargai beberapa umpan balik, tetapi jika tidak, abaikan ini atau minta saya untuk menghapusnya dan saya akan melakukannya.

Adakah berita tentang

@ dandv Saya telah melakukan penyelidikan apakah Jest dapat mendukung modul ES asli di node 12. Ini akan melibatkan Jest menggunakan vm.SourceTextModule API, yang memerlukan beberapa flag CLI untuk diteruskan ke node :

--experimental-modules --es-module-specifier-resolution=node --experimental-vm-modules

API juga tingkat super rendah.

TBD.

Diskusi di https://github.com/nodejs/node/issues/27387

Pembaruan: disuruh menunggu hingga desain pemuat modul Node dikunci. Sementara itu, standar-hal/esm#706 mungkin merupakan pilihan terbaik.

jest adalah perpustakaan pengujian yang sangat bagus. dukungan untuk esm benar-benar semua itu perlu lengkap!

Pembaruan: disuruh menunggu hingga desain pemuat modul Node dikunci. Sementara itu, standar-hal/esm#706 mungkin merupakan pilihan terbaik.

ini tidak bekerja dengan lelucon, sayangnya.

@jdalton Kami menggunakan lodash-es , yang merupakan build ES Module Exports dari lodash. Proyek kami adalah proyek Angular v7, yang menggunakan Webpack v4 sebagai bundlernya. Bagi mereka yang tidak tahu, lodash-es dapat digoyang dengan Webpack v4! ( )⊃━☆゚.*・.

Sayangnya ini menyebabkan masalah bagi kami mengingat Jest belum memiliki dukungan Modul ES. Kami berharap fitur ini akan segera menjadi bagian dari Jest. Adakah yang tahu cara membuat lodash-es bekerja dengan Jest?

Jest gagal dengan pesan kesalahan:

node_modules\lodash-es\lodash.js:10
    export { default as add } from './add.js';
    ^^^^^^

    SyntaxError: Unexpected token export

Jest.config.js kami

Kami juga menggunakan paket npm jest-preset-angular .

module.exports = {
  testMatch: ['**/+(*.)+(spec|test).+(ts|js)?(x)'],
  transform: {
    '^.+\\.(ts|js|html)$': 'ts-jest'
  },
  resolver: '@nrwl/builders/plugins/jest/resolver',
  moduleFileExtensions: ['ts', 'js', 'html'],
  collectCoverage: true,
  coverageReporters: ['html']
};

Sayangnya ini menyebabkan masalah bagi kami mengingat Jest belum memiliki dukungan Modul ES. Kami berharap fitur ini akan segera menjadi bagian dari Jest. Adakah yang tahu cara membuat lodash-es bekerja dengan Jest?

Beri tahu Jest untuk tidak mengabaikan lodash-es saat mengubah:

  "transformIgnorePatterns": [
    "[/\\\\]node_modules[/\\\\](?!lodash-es/).+\\.js$"
  ],

@azz apakah Anda tahu kapan desain pemuat modul Node akan dikunci?
Karena:

npx -n '--experimental-modules' jest func.spec.js

akan sangat keren dan mudah-hidup.

@haraldrudell per instruksi tidak jelas cara menggunakan paket, dikatakan: buat file di sebelah package.json bernama jest.config.js content module.exports = require('jest-esnext') , tetapi bagaimana jika saya sudah memiliki konfigurasi? Bagaimana cara mengintegrasikan?

ini file yang digunakan

https://github.com/haraldrudell/ECMAScript2049/blob/master/packages/jest-esnext/config/jest.config.js

anda mungkin dapat mengganti isi _default dengan yang dari jest.config.js

Halo kawan-kawan,
node 12.13.0 LTS akhirnya dirilis ... ada berita tentang hal itu?

@ mtsmachado8 Saya khawatir masih diperlukan waktu oleh tim v8 tentang masalah ini karena saya melihat modul ESM masih ditandai sebagai eksperimental ... mereka gagal pada peta jalan untuk itu mungkin.

https://nodejs.org/api/esm.html

Untuk ESM yang tidak ditandai, PR ini ada
https://github.com/nodejs/node/pull/29866

@azder @haraldrudell jadi pada dasarnya dalam solusi Anda, Anda melakukan transformasi Babel untuk semua file JS termasuk yang ada di node_modules ?

Dalam kasus saya, saya harus menggunakan preset Anda secara langsung karena saya belum menemukan cara mengkonfigurasi transformator seperti:

const babelPreset7Esnext = require('babel-preset-7-esnext');
const babelJest = require('babel-jest');

module.exports = babelJest.createTransformer(
    babelPreset7Esnext(undefined, {decorators: {legacy: true}})
);

Node sekarang memiliki dukungan modul yang diaktifkan secara default

https://github.com/nodejs/node/pull/29866

Dukungan default Modul ECMAScript mendarat di 13.2.0

https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V13.md#13.2.0

Kami tidak akan mengerjakan ini sampai loader tersedia. Tanpa mereka, Node tidak memiliki kaitan yang dibutuhkan Jest untuk memberikan dukungan yang tepat. Lihat https://medium.com/@nodejs/announcing -core-node-js-support-for-ecmascript-modules-c5d6dc29b663 (Saya tidak dapat menautkan langsung ke bagian tersebut, tetapi ini adalah bagian yang "Sedang Berproses" di dasar)

Bagi mereka yang menggunakan modul asli dan ingin menggunakan jest .
Saat Anda mengerjakan ini, saya menyarankan perbaikan cepat untuk node v. 13.2.0:
babel-plugin-transform-default-impor
Penggunaan (dalam _package.json_):

{
  "babel": {
    "presets": [
      [
        "@babel/preset-env",
        {
          "targets": {
            "node": "current"
          }
        }
      ]
    ],
    "plugins": ["transform-default-import"]
  },
}

Lib perlu menginstal:
npm i --save-dev @babel/core @babel/preset-env babel-plugin-transform-default-import

Catatan: Anda mungkin tidak perlu menggunakan babel-plugin-transform-default-import jika Anda tidak memiliki lib yang memiliki babel bernama export (atau Anda tidak menggunakannya)

@infodusha Luar

Dalam proyek saya ini berfungsi tanpa plugin:

npm i --save-dev @babel/preset-env

babel.config.js (yang ini harus dinamai demikian, bukan .babelrc ):

module.exports = {
    presets: [
        [
            '@babel/preset-env',
            {
                targets: {
                    node: '13.2',
                },
                modules: 'commonjs',
            },
        ],
    ],

    plugins: [],
};

triknya adalah dengan memisahkan file ke dalam direktori dan menggunakan package.json di dalamnya:

di test dir, saya menggunakan

{
  "type": "commonjs"
}

sementara di src dir:

{
  "type": "module"
}

@azder Tetapi jika Anda mengimpor paket yang menyediakan impor bernama commonjs dalam modul asli, Anda perlu mengimpornya dengan impor default dan di babel Anda perlu menggunakan impor bernama. Kemungkinan, Anda tidak memiliki paket seperti itu, atau paket yang menyediakan ekspor es6, tetapi tidak semua paket siap untuk melakukannya besok

@infodusha Mungkin saya tidak punya apa sekarang? Apakah Anda mencoba apa yang saya tulis dan menemukan masalah dengannya atau apakah Anda hanya menganggap saya memiliki masalah dalam menggunakannya?

Berikan contoh aktual karena saya tidak mengerti apa yang Anda maksud dengan "paket impor yang menyediakan commonjs bernama impor dalam modul asli".

Sejauh ini saya tidak punya masalah menulis semua file dengan ekstensi file .js di mana di direktori ./src adalah "type":"module" dan direktori "type":"commonjs" ./test "type":"commonjs" dengan ini:

const imported = require('../src/module.js').default;
const {anotherOne} = require('../src/module.js');

Itu karena Jest secara diam-diam mengubah Modul ES ke kode CommonJS .

Inilah yang menurut saya harus menguji Modul ES secara asli:

(async () => {
    const [
        { default: imported },
        { anotherOne },
    ] = await Promise.all([
        import('../src/some-module.js'),
        import('../src/another-module.js'),
    ]);

    // Rest of your test goes here.
})();

@azder itu adalah solusi.

Buat direktori mymodule dengan package.son type=module dan dua file di dalamnya: first.js dan second.js .
Kemudian coba import { first } from "mymodule";

Anda memerlukan bidang exports di json untuk menggunakan Node ESM, dan saat ini tidak ada paket yang memilikinya (yaitu: lodash).

Contoh Anda mungkin tampak berfungsi tetapi rusak segera setelah salah satu dari some-module.js atau another-module.js mencoba import modul bernama: mereka akan rusak pada kaskade.

@damianobarbati Anda _ MEMBUTUHKAN _ "type": "module" di package.json , tanpa itu, semua .js file dalam modul Anda akan dimuat sebagai CommonJS .

exports hanya digunakan untuk membatasi apa yang diekspos ke konsumen eksternal dan untuk ekspor bersyarat , sama sekali tidak berpengaruh pada apakah file .js akan diuraikan sebagai CommonJS atau ESM .

@damianobarbati Anda salah, sesuai dengan apa yang dikatakan @Exe-Boss, btw,

Itu karena Jest secara diam-diam mengubah Modul ES ke kode CommonJS.

Ya, saya mengandalkan keanehan Jest, itulah alasan saya menggunakan babel.config.js bahkan tanpa menambahkan babel ke devDependencies

@damianobarbati

Harap dicatat, saya memiliki proyek yang berfungsi, di dalamnya saya menggunakan Jest yang ditranspilasikan, sedangkan direktori src memiliki tipe modul, perhatikan, ./src bukan root tempat file konfigurasi babel berada (yang itu adalah CJS karena keanehan).

Juga, Anda benar karena saya tidak mengimpor apa pun dari NPM yaitu CJS karena menurut saya NPM (atau pembuat paket) tidak cukup siap untuk dipadupadankan.

Tujuan dalam proyek saya adalah hanya memiliki ESM (untuk mengurangi lemak perkakas), jadi Jest adalah satu-satunya pengecualian yang akan ditransplantasikan dengan sendirinya.

@damianobarbati

Sesuatu seperti itu, inilah proyeknya https://github.com/azder/clip . Perhatikan bahwa tidak ada "ketergantungan" di package.json sesuai kalimat terakhir dari kutipan posting blog, saya memutuskan untuk tidak mencampur modul ESM dan CJS dari NPM.

Dengan cara ini untuk kebutuhan Jest, ia mengubah apa yang diperlukan dari modul ESM saya, tetapi mungkin lebih banyak konfigurasi babel akan diperlukan untuk menangani direktori node_modules .

https://medium.com/@nodejs/announcing -a-new-experimental-modules-1be8d2d6c2ff

Saat ini, tidak mungkin membuat paket yang dapat digunakan baik melalui require('pkg') dan import 'pkg'. Ada upaya yang sedang dilakukan untuk mengatasi hal ini, dan mungkin melibatkan perubahan di atas. Secara khusus, Node.js mungkin memilih bidang selain "utama" untuk menentukan titik masuk modul ES paket. Meskipun kami menyadari bahwa komunitas telah merangkul bidang "modul", kecil kemungkinannya Node.js akan mengadopsi bidang itu karena banyak paket yang diterbitkan menggunakan "modul" menyertakan modul ES JavaScript yang mungkin tidak dievaluasi di Node.js (karena ekstensi ditinggalkan dari nama file, atau kode menyertakan pernyataan yang diperlukan, dll.). Tolong jangan publikasikan paket modul ES apa pun yang dimaksudkan untuk digunakan oleh Node.js sampai masalah ini diselesaikan.

Silakan lihat #9430 yang baru saja saya buka untuk melacak dukungan di Jest. Saya akan membiarkan masalah ini terbuka untuk diskusi.

@SimenB ini pertanda baik! Ini dan penyebutan modul dalam catatan rilis Jest 25 memberikan harapan untuk melihat dukungan lebih cepat.

@SimenB jika saya ingat dengan benar Jest tidak dapat menggunakan paket NPM yang diterbitkan sebagai ESM saja, yang memaksa untuk mengaktifkan Babel untuk beberapa paket node_modules juga. Apakah ini berubah?

Anda harus mengubah impor/ekspor hingga dukungan tersedia, baik kode pengguna dan perpustakaan

@SimenB :

Anda harus mengubah impor/ekspor hingga dukungan tersedia, baik kode pengguna dan perpustakaan

Untuk kasus kami, cara terbaik sejauh ini adalah ini, karena semua paket kami memiliki dir /es/ , tetapi itu rapuh dan mungkin tidak cocok untuk proyek lain:

transformIgnorePatterns: ['node_modules/(?!.*?/es/.*\\.js)'],

Jest tidak mengambil paket-paket itu tanpa transformasi meskipun type: module , seperti yang Anda katakan.

Anda harus mengubah impor/ekspor hingga dukungan tersedia, baik kode pengguna dan perpustakaan

Ada jadwal kasar tentang ini?
dari rilis simpul 14:

Kami percaya bahwa implementasi saat ini menawarkan model bukti masa depan untuk pembuatan modul ESM yang membuka jalan ke Universal JavaScript. Silakan baca lebih lanjut di dokumentasi kami.

Implementasi ESM di Node.js masih eksperimental tetapi kami yakin bahwa kami semakin dekat untuk dapat memanggil ESM di Node.js “stabil”. Menghapus peringatan adalah langkah besar ke arah itu.

karena itu saya enggan mengekspor paket NPM (yang mungkin dikonsumsi oleh pengujian yang mengimplementasikan kerangka kerja pengujian JEST) menggunakan commonJS lebih lama.

Kami mengirimkan versi eksperimental dari Jest 25.4. Cukup banyak perbaikan bug di 25.5, tetapi masih belum di tempat yang seharusnya. Anda dapat mengikuti perkembangannya di #9430

Apakah halaman ini membantu?
0 / 5 - 0 peringkat