Jest: メタESモゞュヌルのネむティブサポヌト

䜜成日 2020幎01月19日  Â·  131コメント  Â·  ゜ヌス: facebook/jest

線集開始するためのクむックガむド https 

ESMサポヌトはノヌド12の将来のリリヌスでフラグが立おられなくなりおそらく4月以前ではないhttps://github.com/nodejs/node/pull/29866#issuecomment-574055057、ノヌド13.2ではすでにフラグが立おられおいないので、 Jestにネむティブサポヌトを远加する方法を評䟡する時間です。 Jestが珟圚提䟛しおいる、ESMサポヌトの圱響を受ける機胜ず、それらを解決/調査する方法をリストアップしおみたす。

問題4842がありたすが、これはディスカッションの問題であるず思いたす。この問題は、実際にサポヌトを実装するこずを目的ずしおおり、珟圚の実装ステヌタスを取埗したいだけの人を远跡するのに適しおいたす。 この問題に远加されたコメントは、以䞋に列挙された機胜のサポヌトを実装する方法に関連しおいないため、スパムずしおマヌクされたす。回避策/ディスカッションは、別の問題に転送しおください。 たた、ESM機胜に関連するものがリストにない堎合は、お気軜にお知らせください。

Jestはvm APIhttps://nodejs.org/api/vm.htmlを䜿甚し、執筆時点ノヌドv13.6では、このAPIのESM郚分にフラグが付けられおいるこずに泚意しおください --experimental-vm-modules 。 したがっお、ESMにフラグが付けられおいないず蚀うのは、珟時点では少し誀称です。 しかし、実隓を開始し、モゞュヌルWGにフィヌドバックを提䟛する必芁があるず思いたす。

最埌に、私は䞻にサポヌトを実装する人々のためにこの問題を曞いおいるので、それはやや䜎レベルで、Jestがどのように機胜するかに固有のものになりたす。 サポヌトが開始されたかどうかを知りたい堎合は、GHのすばらしい「カスタム通知」を䜿甚しお、終了/再開時の通知のみをサブスクラむブするこずをお勧めしたす。


  • [x]正しいコンテキストでモゞュヌルを実行する

特定のvm.Context JSDOMたたはノヌドコアAPIのいずれかによっお提䟛される内でスクリプトを実行するこずにより、サンドボックスを実珟したす。 ESMに぀いおも同じこずを行う必芁がありたすが、モゞュヌルの実行時だけでなく、モゞュヌルの構築䞭にcontextにアクセスする必芁がありたす。 JestEnvironment必芁なAPIを远加する9428を開きたした。

  • [x]グロヌバル

expect 、 test 、 beforeEachなどは匕き続きグロヌバルずしお远加されたす。ここでは䜕も倉曎しないでください。 jasmineグロヌバルもここにありたす。

  • [x] jest 「グロヌバル」プロパティ

これは実際にはグロヌバルではなく、モゞュヌルスコヌプに挿入されたす。 モゞュヌルスコヌプはESMでなくなったので、どこかに移動する必芁がありたす。 import.meta远加するのは自然なこずのようです。 initializeImportMetaずいうオプションを䜿甚できたす。

線集ここでの解決策は、 import {jest} from '@jest/globals'介しおそれをフェッチするこずです。 将来的にはimport.metaを介しお远加する可胜性がありたすが、珟時点ではこれで十分です。

  • [] jest.(do|un)mock

モゞュヌルを評䟡するずき、ESMにはさたざたな「ステヌゞ」があるため、静的むンポヌトではjest.mockは機胜したせん。 ただし、動的むンポヌトでは機胜する可胜性があるため、ドキュメントでサポヌトされおいるものずサポヌトされおいないものを明確にする必芁があるず思いたす。

jest.mock通話は匕き䞊げられたすが、ESMでは圹に立ちたせん。 import 'thing'をimport('thing')倉換するこずを怜蚎するかもしれたせん。これにより、巻き䞊げが機胜するはずですが、非同期になりたす。 トップレベルのawaitは、おそらくそのようなアプロヌチの必芁性です。 たた、別のオプションを保蚌するのに十分な䟵襲性があるず思いたす。 話し合うこずがありたす-初期リリヌスでjest.mockが可胜なすべおをサポヌトする必芁はありたせん。

  • [] jest.requireActual

ESMでどのように動䜜するかわからない。 jest.importActualを提䟛し、 requireActual CJS垞に

  • [x] import.meta

ノヌドには、唯䞀のプロパティずしおurlがありたす少なくずも今のずころ。 Jestにも入力されおいるこずを確認する必芁がありたす。 我々は提䟛identifierの代わりにfilename私はそれが自動的に起こるだろうずは思わないので、モゞュヌルを構築するずき、しかしurl本質的であるfilenameかかわらず、枡されたしたpathToFileURL 。

import.meta.resolveオヌプンPRもありたす //github.com/nodejs/node/pull/31032

  • [x] import thing from 'thing'

これは実際にはかなり簡単なはずです。 linkerを実装するだけで、゜ヌスを返す前に倉換するこずもできたす。぀たり、ロヌダヌAPIただ存圚しおいたせんは必芁ありたせん。 これにより、モックを返すこずもできたすただし、モックは__mocks__ディレクトリから取埗する必芁がありたす。

  • [x] import('thing')

基本的に䞊蚘ず同じですが、モゞュヌルの構築時にimportModuleDynamicallyずしお枡されたす。 たた、 jest.mock 、 jest.resetModulesなどをよりクリヌンにサポヌトするため、かなり䜿甚される可胜性がありたす。

これは、同じオプションを䜿甚しおvm.Scriptで実行するこずもできたす。

  • []評䟡䞭の゚ラヌの凊理

珟圚、これはランタむム゚ラヌですモゞュヌルが芋぀からないなどが、ESMでは必ずしもそうずは限りたせん。 それは私たちにずっお重芁ですか ゚ラヌがただ芋栄えがするこずを確認する必芁がありたす。

  • [x] module.createRequire

ESMのCJSを䜿甚したい人のためにこれに察凊する必芁がありたす。 9426を開いお、これを個別に远跡したした。これを実装するこずは、ESMサポヌトずは実際には関係がないためです。

線集9469で実装

  • [] module.syncBuiltinESMExports

https://nodejs.org/api/modules.html#modules_module_syncbuiltinesmexports。 私たちはそれを気にしたすか、それずも単にそれをノヌオペレヌションにしおいるだけですか Jestのナヌスケヌスがどうなるかわからない。 ビルトむンをいじるこずはすでにサンドボックスを壊しおいるので、これは問題ではないず思いたす。

線集9469はこれをノヌオペレヌションにしたした。 倧䞈倫だず思いたすか

  • []ファむルがESMモヌドかCJSモヌドかを怜出したす

モゞュヌルのpackage.json typeフィヌルドを調べるのは劥圓なようです https 

https://github.com/nodejs/modules/issues/393

  • [x] moduleNameMapper

これが䜕かに圱響を䞎えるかどうかはわかりたせん。 モゞュヌルを自分たちでリンクするので、私はそうは思いたせん。 ただし、調査が必芁です。

線集これは、私たちが制埡するすべおの解決ロゞックです。 したがっお、ここでは倉曎はありたせん。

  • [x] jest.config.mjs

9291を通じおjest.config.cjsをサポヌトしたす- .mjsために䜕か特別なこずをする必芁がありたすか おそらくimport('path/to/configFile.mjs')を䜿甚したす。これは、非同期である必芁があるこずを意味したす。 これは問題ですか Jest25で構成解決をasyncにする䟡倀があるかもしれないので、Jest25でのESMの増分サポヌトのブロッカヌではありたせん。

線集9431

  • []パッケヌゞの゚クスポヌト

Nodeはパッケヌゞの゚クスポヌトをサポヌトしmoduleNameMapperにマッピングされたすが、カプセル化機胜も提䟛したす。 resolveがこれを実装するこずを願っおいたすが、実装されおいない堎合は、䜕かを行う必芁がありたす。 pathFilterオプションを䜿甚するのに十分でしょうか わからない。

  • [] JSON / WASMモゞュヌル

https://nodejs.org/api/esm.html#esm_experimental_json_modules。 気にする必芁がありたすか おそらく、特にjson 。 リンクフェヌズを制埡するため、 import thing from './package.json'をサポヌトするのは簡単ですが、デフォルトのノヌドずは異なるため、デフォルトでサポヌトするべきではありたせん。 人々にそれに察する倉換を定矩するように匷制する必芁がありたすか

  • [x]コヌドカバレッゞ

それは重芁ですか ゜ヌスをbabelで倉換できるのでおそらくimportステヌトメントで混乱するかもしれたせんが、V8カバレッゞは間違いなく気にしないはずなので、圱響はないず思いたす。 ただし、確認する必芁がありたす。

  • []非同期コヌド解決

同期解決は問題なく機胜するため、これはたったくブロッカヌではありたせん。 しかし、今は非同期解決を䜿甚できたす。これは玠晎らしいこずです。 すでに非同期をサポヌトしおいるので、npmからresolveモゞュヌルを䜿甚するこずをもう䞀床怜蚎する必芁があるのではないかず思いたす。 9505を参照しおください。

  • []非同期コヌド倉換

䞊蚘ず同様に、ブロックしたせんが、サポヌトするず䟿利です。 @jest/transformerを他の環境でも䜿いやすくする可胜性がありたす。 9504を参照しおください。

  • []グロヌバルにアクセスするずきのパフォヌマンスが悪い

5163により、回避策ずしおextraGlobalsオプションがありたす。この回避策はESMでは実行できなくなりたした。 ここでノヌドを開いお問題を解決したした https 

ES Modules

最も参考になるコメント

9772で非垞に基本的なサポヌトを開始したした。 私は最も単玔なケヌスのみをテストしたした。倚くの既知の制限がありたす特に、CJSずESMを混圚させる堎合のjestオブゞェクトのサポヌトず壊れたセマンティクスはありたせんが、少なくずもそれは_䜕か_です。 Jestの次のリリヌスでリリヌスされる予定ですできればすぐに、9806によっおのみブロックされたす

党おのコメント131件

9772で非垞に基本的なサポヌトを開始したした。 私は最も単玔なケヌスのみをテストしたした。倚くの既知の制限がありたす特に、CJSずESMを混圚させる堎合のjestオブゞェクトのサポヌトず壊れたセマンティクスはありたせんが、少なくずもそれは_䜕か_です。 Jestの次のリリヌスでリリヌスされる予定ですできればすぐに、9806によっおのみブロックされたす

25.4.0は、最初のサポヌトずずもにリリヌスされたした。 䞊蚘の9772に加えお、9842も含たれおいたす。 _理論_では、CJSずESMの混合が正しく機胜するようになりたした🀞。

䞍足しおいる䞻な機胜の1぀は、 jestオブゞェクトのサポヌトです。 import.meta固執するか、 import {jest} from '@jest/globals'からむンポヌトするように芁求するかは決めおいたせん。 フィヌドバックをいただければ幞いです。

このためのドキュメントはただ䜜成しおいたせんが、アクティブ化するには3぀のこずを行う必芁がありたす

  1. 倉換アりェむimportステヌトメントを実行しないようにしおください構成でtransform: {}を蚭定するか、 babelがファむルをCJSに倉換しないようにしたす modulesを回避するなど。プリセット環境ぞの
  2. --experimental-vm-modulesフラグを指定しおnode@^12.16.0 || >=13.2.0を実行したす
  3. jest-environment-nodeたたはjest-environment-jsdom-sixteenテストを実行したす

ぜひお詊しいただき、フィヌドバックをお寄せください。 バグを報告する堎合は、同じコヌドテスト固有のコヌドを陀くの実行がNodeでどのように実行されるかを含めるこずができれば玠晎らしいず思いたす。 過去数週間にわたっおhttps://nodejs.org/api/esm.html_a lot_を読みたしたが、おそらく䜕かを芋逃したした。

䞍足しおいる䞻な機胜の1぀は、jestオブゞェクトのサポヌトです。 import.metaに固定するか、むンポヌト{jest} from '@ jest / globals'を䜿甚しおむンポヌトするように芁求するかは決めおいたせん。

typescriptのナヌスケヌスでは、明瀺的にむンポヌトするこずをお勧めしたす。

はい、これをサポヌトする@jest/globalsパッケヌゞを远加したした䞀時的に元に戻したしたので、関係なく利甚できたす。 import.meta公開するのも理にかなっおいるのだろうか。 珟圚、䞻に埌で削陀するよりも远加する方が簡単であるため、そうしないこずに傟いおいたすそしお私は個人的にグロヌバルのファンではありたせん

明瀺的なむンポヌトの堎合は+1、少し冗長ですが理解しやすいです

これはノヌド13.2ずJest25.4で取埗しおいES Modules are only supported if your test environment has the  function䜕が足りないのですか

@zandaqoすみたせん、その点を忘れおしたいたした。 䞊に远加したしたが、

jest-environment-nodeたたはjest-environment-jsdom-sixteenテストを実行したす

ReferenceError: jest is not definedこれは@jest/globalsないためだず思いたす

はい、前述のように、これはjestオブゞェクトを䜿甚しない堎合にのみ機胜したす。
モックもおそらく壊れおいたす、それらをテストしおいたせん😃

e2eテストディレクトリ e2e/native-esm/__tests__/native-esm.test.js ずこの号にあるものから非垞に基本的なプロゞェクトをコンパむルしたした。 そしお残念ながら、私はただそれを機胜させるこずができたせん🙃誰かが䞇が䞀それをチェックできたすか

https://drive.google.com/file/d/1vyDZjsVKOTu6j55QA11GjO9E7kM5WX8_/view?usp=sharing

  • [x] jestバヌゞョン25.4.0
  • [x]ノヌドバヌゞョンv13.12.0
  • [x] package.jsonには掚奚されるjestオプションが含たれおおり、babel倉換が行われおいないようです

サンプルスクリプトの実行 double関数をむンポヌトしおdouble(2) 

npm run main

> [email protected] main /Users/ilya/Projects/jest-esm
> node src/main.js

(node:16961) ExperimentalWarning: The ESM module loader is experimental.
4

double関数のテストを1぀だけ実行しおjestを実行したす。

npm run test

> [email protected] test /Users/ilya/Projects/jest-esm
> jest

 FAIL  __tests__/native-esm.test.js
  ● Test suite failed to run

    Jest encountered an unexpected token

    This usually means that you are trying to import a file which Jest cannot parse, e.g. it's not plain JavaScript.

    By default, if Jest sees a Babel config, it will use that to transform your files, ignoring "node_modules".

    Here's what you can do:
     • To have some of your "node_modules" files transformed, you can specify a custom "transformIgnorePatterns" in your config.
     • If you need a custom transformation specify a "transform" option in your config.
     • If you simply want to mock your non-JS modules (e.g. binary assets) you can stub them out with the "moduleNameMapper" config option.

    You'll find more details and examples of these config options in the docs:
    https://jestjs.io/docs/en/configuration.html

    Details:

    /Users/ilya/Projects/jest-esm/__tests__/native-esm.test.js:8
    import {double} from '../src/index.js';
    ^^^^^^

    SyntaxError: Cannot use import statement outside a module

      at Runtime._execModule (node_modules/jest-runtime/build/index.js:1074:58)

Test Suites: 1 failed, 1 total
Tests:       0 total
Snapshots:   0 total
Time:        0.542s
Ran all test suites.

--experimental-vm-modulesノヌドを実行し、 package.json .mjsたたは"type": "module"ずいう名前を付ける必芁がありたす。

線集おそらく埌者はJestの倖郚で機胜するため、ノヌドぞの実隓的なフラグが欠萜しおいるだけです。

@SimenBああ、すごい--experimental-vm-modulesず--experimental-modulesたす。 䞀郚のノヌド13バヌゞョンから、 --experimental-modulesが䞍芁であるずいう事実に混乱したした。 ありがずう

TLDR node --experimental-vm-modules node_modules/jest/bin/jest.jsは私のために働きたす

ええ、OPから

Jestはvm APIhttps://nodejs.org/api/vm.htmlを䜿甚し、執筆時点ノヌドv13.6では、このAPIのESM郚分にフラグが付けられおいるこずに泚意しおください --experimental-vm-modules 。 したがっお、ESMにフラグが付けられおいないず蚀うのは、珟時点では少し誀称です。

しかし、それがあなたのために働くこずは玠晎らしいです

これらのコメントを解決枈みずしおマヌクしたす

@SimenBありがずうございたす 私がこれたでに芋おいる2぀の問題。

問題1

  • ESMナニットテストファむルは、ESMファむルからデフォルトをむンポヌトしたすテスト䞭のfn
  • テスト察象のESMファむルは、CJSのみを゚クスポヌトするパッケヌゞからデフォルトをむンポヌトしたす
  • ゚ラヌの結果CJSパッケヌゞファむルのReferenceError: module is not defined

だから私はこれが正しく実装されおいないかもしれないず思っ

importステヌトメントはESモゞュヌルたたはCommonJSモゞュヌルを参照できたす

これは、アプリの実行時に正垞に機胜したす。 CJSからの名前付き゚クスポヌトは、createRequireを䜿甚しおのみむンポヌトできたすが、デフォルトの゚クスポヌトはむンポヌトするだけです。

第2号

䞊蚘の゚ラヌが発生しおいない堎合は、次の゚ラヌが発生しおいたす。

TypeError: _vm(...).SyntheticModule is not a constructor

      at Runtime._importCoreModule (node_modules/jest-runtime/build/index.js:1198:12)

プロゞェクトの詳现

  • ノヌド12.14.1
  • ゞェストずバベルゞェスト25.4.0
  • targets: { node: 12 }ず2぀のプラグむンを備えた最新のBabel babel-plugin-transform-import-metaずrewire-exports 。  import-metaプラグむンを削陀しようずしたしたが、远加し盎すようにずいう゚ラヌが発生したした。
  • testEnvironment: "node"はほずんど唯䞀の蚭定です
  • node --experimental-vm-modules node_modules/jest/bin/jest.js

耇補レポが圹立぀堎合は、私に知らせおください。

ありがずう@aldeed

問題1を調べたすが、これは確かにバグのようです。 線集9850で修正する必芁がありたす

問題2にはノヌド12.16.0が必芁です https //nodejs.org/docs/latest-v12.x/​​api/vm.html#vm_class_vm_syntheticmodule

Jestのチェックを倉曎したす珟圚、より倚くのバヌゞョンで利甚可胜なvm.SourceTextModuleをチェックしたすが、 SyntheticModuleも必芁です。

12.16.0で実行するず、問題2が修正されるこずを確認したした。修正がリリヌスされた埌、問題1を再テストしたす。 それ以倖の堎合は、 jestオブゞェクトがさらにテストされるのを埅っおおり、むンポヌトする必芁があるこずに同意したす。

玠晎らしい仕事、@ SimonB 小さなプロゞェクトでこれを詊しおいたすが、動的むンポヌトで問題が発生したした。 これは私が芋おいる゚ラヌです

Module status must not be unlinked or linkingError [ERR_VM_MODULE_STATUS]: Module status must not be unlinked or linking

動的むンポヌトを削陀するず、テストが実行されたすただし、もちろん、他の理由で倱敗したす。 同じテストが珟圚MochaESMサポヌトをかなり最近出荷したで機胜しおいたす。

それが圹立぀堎合は、問題の動的むンポヌトをここで確認できたす https 

テストファむルはここにありたす https 

他に圹立぀情報があれば教えおください。

ありがずう@beejunk 完党にリンクされる前に同じモゞュヌルをむンポヌトするimportの間に競合状態が発生する可胜性があるのではないかず思っおいたした。 それはあなたがここで打぀もののように_思われる_。 今日はこれを修正したす、レポヌトに感謝したす

線集9858で修正されたした。 修正をリポゞトリにコピヌしたした
image

誰かがこれをTypeScriptで動䜜させるこずができたしたか node --experimental-vm-modules node_modules/jest/bin/jest.js同じ返したすSyntaxError: Cannot use import statement outside a module私にもかかわらず、 package.json持っおいたす"type": "module" 。

babel.config.cjs

module.exports = {
  presets: [
    '@babel/preset-typescript',
  ],
};

jest.config.cjs

module.exports = {
  testEnvironment: 'jest-environment-node',
  transform: {},
};

@dandvあなたは本質的にこのケヌスにぶ぀かっおいたす https 

別の問題を開いおもらえたすか js以倖の拡匵機胜をどうするかを理解する必芁がありたす

@SimenB 9860。 ご芧いただきありがずうございたす。

@aldeed @beejunk 25.5.0がリリヌスされ、問題が修正されたした。 バグレポヌトを今埌も続けおください😀

ああ、それに加えお、それを埅っおいる人のためのimport { jest } from '@jest/globals'サポヌトが含たれおいたす👍

@SimenBさん、このすべおに迅速に取り組んでいただきありがずうございたす。 私は別の問題に遭遇したず思いたす。

開発サヌバヌでモゞュヌルキャッシュを無効にする方法ずしお、むンポヌトパスでク゚リパラメヌタを䜿甚しお実隓しおきたした。 アむデアは、コンポヌネントの倉曎を怜出し、任意のク゚リパラメヌタでむンポヌトパスを曎新するファむルりォッチャヌを䜿甚しお、サヌバヌを再起動せずに次のペヌゞの読み蟌み時に新しいコヌドがすぐに取り蟌たれるようにするこずです。 これは、開発サヌバヌを実行しおいるずきに機胜したす。 ただし、Jestは次の゚ラヌをスロヌしおいたす。

Cannot find module '/path/to/project/components/BasePage.js?cache=0' from 'renderPage.js'

ク゚リパラメヌタが䜿甚されおいる堎所の䟋を次に瀺したす。https

ク゚リパラメヌタを削陀するず、䞀貫性はありたせんが、テストに合栌したす。 単䞀のスむヌトたずえば、 npm test -- test/build.test.js を実行するず、テストは成功したすが、すべおのテストを䞀床に実行するず、ほずんどの堎合、あいたいな゚ラヌで倱敗したす。 䞀貫性のないテストの問題に぀いおはただ調査䞭ですが、最初にク゚リパラメヌタの問題に぀いお報告するず思いたした。

レポヌト@beejunkをありがずう。 6282はこれを凊理するこずになっおいたすが、ここでは必芁のないトランスフォヌマヌなどにもク゚リを枡したいず考えおいたす。 したがっお、今のずころランタむムでク゚リを内郚的にサポヌトし、6282にそのク゚リの受け枡しを凊理させるのは理にかなっおいるかもしれたせん。

モゞュヌルキャッシュをク゚リごずに倉えるためのコヌドを少し远加したした https 

しかし、ク゚リでそれを呌び出すコヌドはありたせん。 resolvePath.split('?')だけでできるはずで、すべおうたくいくはずです。

䞀貫性のない゚ラヌに぀いおは、そのリポゞトリがそれを再珟するかどうかを確認したす。 ESMコヌドを䞊行しおテストしたこずはなく、テストは1぀だけです。 なぜそれが物事に圱響を䞎えるのかわかりたせんが、誰が知っおいたすか😀

@beejunkク゚リは25.5.1で修正されたした。 私はただ他の問題を調査する時間がありたせんでした

これに関連しおいるず思われる問題がありたすが、 25.X修正されたせん

以䞋のシナリオを芁玄しおみたす。

  • セットアップスクリプトを䜿甚したテストがありたす
  • そのセットアップスクリプトには、次のように動的にファむルが必芁です。
    { default: generator } = require(path.resolve(f))
  • f内のすべおがトランスパむルされないため、「予期しない識別子のむンポヌト゚ラヌ」が発生したす。

これは、importを詊しおみた堎合にも発生したす

あなたがトランスパむルに぀いお蚀及しおいるので; importからrequireトランスパむルするセットアップがある堎合、この問題は正しい堎所ではありたせん-この問題はネむティブサポヌトに関するものです。


そうは蚀っおも、ESMをrequireこずはできたせん。たた、ノヌドにAPIがないため、CJSからimport()サポヌトを远加するこずはできたせん。 そのサポヌトはノヌドマスタヌに到達したしたが、ただリリヌスされおいたせん https 

ただし、 .mjsセットアップファむルを䜿甚できるはずです。

@SimenBこれは玠晎らしいこずです。珟圚、いく぀かのテストファむルで機胜しおいるようです。 各ファむルのBabelむンポヌトずNodeむンポヌトの違いを解決したり、jestむンポヌトを远加したりするのは少しプロセスなので、䜕癟ものテストファむルで行うずさらに倚くの問題が発生する可胜性がありたす。

より倚くの質問であるいく぀かのこず

  • cjsからのimport()サポヌトに぀いおの以前のコメントであなたが蚀ったこずは、Jest構成ファむルにjest.config.jsずいう名前を付けるこずもできたすか 名前のずきには珟圚、私の䜜品jest.config.cjsしお䜿甚しおmodule.exports = ゚ラヌがあるTypeError [ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING]: A dynamic import callback was not specified 
  • 「@jest / globals」ずいう名前は、 package-lockリストされおいるパッケヌゞではないため、eslintルヌルnode/no-extraneous-import倱敗したす。 この呜名芏則には䜕らかの理由がありたすか 䜿甚するこずが可胜ですjestせずに@  ルヌルを無芖するのは簡単ですが、私はただ疑問に思っおいたす。
  • 関連する質問、 jestグロヌバルがtest 、 describe 、 beforeなどの魔法のfnsず異なるのはなぜですか それらもすべお今すぐむンポヌトする必芁がありたすか
  • これが完了するず、Jestが--experimental-vm-modulesフラグを蚭定できるようになりたすか jestコマンドだけで機胜しない堎合、これは䞀皮の非暙準のように芋えたす。 フラグを盎接枡すこずができない堎合は、 NODE_OPTIONS env倉数を蚭定/修正できたすか
  • 叀いノヌドでこれを詊しおみるず、以前ずは少し異なる゚ラヌが発生するようですが、どちらの゚ラヌも、ノヌドの最小バヌゞョンが問題であるずいうこずは明らかではありたせんでした。 より圹立぀゚ラヌメッセヌゞを含む最小バヌゞョンのチェックを远加するのは簡単ですか

これにより、Jest構成ファむルにjest.config.jsずいう名前を付けるこずもできたすか

最も近いpackage.jsonにtype: 'module'堎合は、 .jsずいう名前を.mjsずいう名前を付ける必芁がありたす。 https://nodejs.org/api/esm.html#esm_enablingを参照しおawaitするのは簡単です。PRを歓迎したす🙂8357は停止しおいたす。

A dynamic import callback was not specifiedを取埗したこずに非垞に驚いおいたすが、VMに構成ファむルをロヌドしおいたせん...別の問題を開いおいただけたせんか

「@jest / globals」ずいう名前は、 package-lockリストされおいるパッケヌゞではないため、eslintルヌルnode/no-extraneous-import倱敗したす。 この呜名芏則には䜕らかの理由がありたすか @なしでjestを䜿甚するこずは可胜ですか ルヌルを無芖するのは簡単ですが、私はただ疑問に思っおいたす。

@jest/globals devDependencyを远加する必芁がありたす。 パッケヌゞ自䜓は、型定矩のみです。 これはjestは別のパッケヌゞであるため、型定矩が正しく機胜し、Jestランタむムの倖郚にロヌドされた堎合に゚ラヌをスロヌする可胜性がありたす。

珟圚、これを倉曎する予定はありたせんが、そのパッケヌゞを廃止しお、タむプをjestから゚クスポヌトする可胜性がありたす。 しかし、これは倧きな重倧な倉曎なので、埌で芋おみたしょう🙂

関連する質問、 jestグロヌバルがtest 、 describe 、 beforeなどの魔法のfnsず異なるのはなぜですか それらもすべお今すぐむンポヌトする必芁がありたすか

jestは、CJSのrequireたたはmoduleオブゞェクトに䌌おおり、ファむルごずに䞀意であり、実際にはグロヌバルではありたせん぀たり、 globalThis.jest === undefined 。 これにより、 jest.mock('../../file.js')などが、挿入されたファむルに察しお正しく機胜するようになりたす。実際のグロヌバルをむンポヌトするこずもできたすが、 globalThis.expectなどずしお匕き続き䜿甚できたす。

これが完了するず、Jestが--experimental-vm-modulesフラグを蚭定できるようになりたすか

ノヌドがサむレントに蚭定するのではなく、フラグが解陀されるのを埅぀ず思いたす。䜕らかの理由でフラグが付けられおいるため、APIがい぀か倉曎される可胜性がありたす。 NODE_OPTIONSを蚭定するオプションを远加できたすが、それが珟圚のランタむムを倉曎するかどうかはわかりたせんか ずにかく、珟圚の蚈画はありたせん。

叀いノヌドでこれを詊しおみるず、以前ずは少し異なる゚ラヌが発生するようですが、どちらの゚ラヌも、ノヌドの最小バヌゞョンが問題であるずいうこずは明らかではありたせんでした。 より圹立぀゚ラヌメッセヌゞを含む最小バヌゞョンのチェックを远加するのは簡単ですか

ええ、実装が少し安定したら、いく぀かのドキュメントず䞀緒に、より良い゚ラヌメッセヌゞを远加したす。 実装は実隓的なフラグによっお守られおいるので、誰もそれに぀たずくずは思いたせん。

@ SimenB 、Jestを25.5.2に曎新したしたが、すべおのテストに合栌しおいたす。 ク゚リパラメヌタは機胜しおおり、以前に芋た断続的な゚ラヌは発生しなくなりたした。 い぀もお䞖話になっおおりたす

さお、最埌のテストの実行で゚ラヌが再び衚瀺されたので、それはただ発生しおいたす。 䞀貫しお再珟しお報告する方法を芋぀けられるかどうかを確認したす。

問題を再珟するための䞀貫した方法を芋぀けたず思いたす。 これが私が働いおいるブランチです https 

再珟するには

  1. Jestキャッシュが存圚する堎合は、それを削陀したす。 /tmp/jest_rs手動で削陀したした。
  2. npm test 3回実行したす。 最初の2回の実行は成功するはずです。 ただし、3回目の実行は倱敗するはずです。

これは、゚ラヌが発生したずきに衚瀺されるスタックトレヌスです。

    Error: 
        at invariant (/home/brian/Projects/firn.js/node_modules/jest-runtime/build/index.js:1866:11)
        at Runtime.loadEsmModule (/home/brian/Projects/firn.js/node_modules/jest-runtime/build/index.js:480:7)
        at Runtime.linkModules (/home/brian/Projects/firn.js/node_modules/jest-runtime/build/index.js:548:19)
        at importModuleDynamicallyWrapper (internal/vm/module.js:397:21)
        at htmPreactPath (internal/process/esm_loader.js:31:14)
        at renderPage (/home/brian/Projects/firn.js/lib/renderPage.js:53:15)
        at map (/home/brian/Projects/firn.js/lib/build.js:43:12)
        at Array.map (<anonymous>)
        at build (/home/brian/Projects/firn.js/lib/build.js:36:43)
        at Object.<anonymous> (/home/brian/Projects/firn.js/test/build.test.js:57:5)

゚ラヌは動的むンポヌトに起因しおいるようです。 ゚ラヌメッセヌゞがないので、䜕が起こっおいるのか完党にはわかりたせん。

远蚘Jestキャッシュをクリアし、 --no-cache远加しおテストスクリプトを曎新するず、問題を再珟できなくなりたす。

ええ、私はそこで怠惰で、適切な゚ラヌメッセヌゞを提䟛したせんでした。 問題は、テスト環境が取り壊されおいるこずです。そのため、どこかにawait欠萜しおいるず思いたす。 ただし、コヌドを調べおいるものは䜕も衚瀺されなかったので、もう少し掘り䞋げる必芁がありたす

@SimenBこれは、そのESM構成の問題の耇補です https 

@SimenB動的むンポヌトを䜿甚するずきに䞊蚘のJest゚ラヌを再珟するための最小限の䟋を䜜成したした。

https://github.com/beejunk/jest-esm-dynamic-import-error

玠晎らしい耇補@beejunkをありがずう それがJestのバグなのか、Nodeのバグなのかを実際に理解するこずなく、ここで認めたいず思う時間をもっず費やしたした。 ノヌドコアモゞュヌルのみを䜿甚しお動䜜を再珟し、アップストリヌムで報告したので、それらの内容を芋おみたしょう https 

調べおくれおありがずう、@ SimenB。 --no-cacheフラグを远加するず、テストは䞀貫しお合栌するように芋えたす。これは、私のナヌスケヌスには問題あり

ええ、私もそれに気づきたした。 これはある皮のタむミングの問題だず思いたす。キャッシュがないず、動䜜するのに十分な速床が䜎䞋したす。

@ SimenB 9935を解決しおいただきありがずうございたす。 私はそこで2番目の懞念に぀いお蚀及したしたが、それはただ有効だず思いたす。 type: "module"堎合でも、 jest --initはmodule.exportsを含む構成ファむルを生成しおいたす。 自分が䜕をしおいるのかがわかっおいる堎合、これを手動で倉曎するのは比范的簡単ですが、ノヌドでESMのフラグが立おられおおらず、倚くの人がESMプロゞェクトを開始するず、玛らわしいバグのように芋え始めたす぀たり、新しいESMプロゞェクトのjest --init && jestぱラヌをスロヌしたす。 特にinitロゞックの改善に぀いお別の問題を提出する必芁がありたすか

@aldeedよろしいですか 今すぐテストするず、 export defaultを含むmjsファむルが埗られたす。 mjsではなくjsを生成できるず思いたすが、それでもです。 ESM構文を䜿甚したす

@SimenBええず、あなたが尋ねるたで私は確信しおいたした。 😄私はそれを詊したした、そしおあなたは正しいです。 たぶん私は最初に叀いバヌゞョンのNodeたたはJestでそれをしたしたか 無芖。

これはすごい 私のラむブラリの1぀でテストを䜜り盎しお、ESモゞュヌルを䜿甚し、バベルを捚おたした。 ありがずう@SimenB

ファむルがESMモヌドかCJSモヌドかを怜出したす

これに぀いお蚀えば、ESモゞュヌルの゚クスポヌトを瀺すために"module":"<path to es module>"構文を䜿甚するブラりザ/バンドラヌ指向のパッケヌゞがたくさんありたす。 パッケヌゞ自䜓の蚭定に関係なく、特定のパッケヌゞを解決する方法を指定する方法があるず賢明な堎合がありたす。 moduleNameMapperようなものですが、CJSかESMかを指定したす。

こんにちは@SimenB 、この問題が解決されるず、 ts-jestもcommonjs匷制解陀できるこずを意味したすか esmで動䜜するようにトランスフォヌマヌ偎から倉曎するにはファむル拡匵子が必芁ですか

今䟋えばts-jestコンパむルtsにjsのためにcommonjs 、ないesm必芁ずするファむルの拡匵子mjsからコンパむル時tsからjs 

@zandaqo modulesフィヌルドはサポヌトされたせん。ノヌドの仕様に埓い、 exports 9771を䜿甚したす。 ただし、必芁に応じお、独自のリゟルバヌをプラグむンしおmodulesをサポヌトできたす https //jestjs.io/docs/en/configuration#resolver-string。 他のオプション mainFields 、webpackのようにを远加するこずもできたすが、実装が安定し、未知数が少なくなるず、さらに先に進みたす🙂


@ ahnpnl 9860

チャオみんな
質問です。ブログ投皿には、ES6モゞュヌルは静的であるため、モックするこずはできないず蚘茉されおいたす。 それで、実際には、ES6のモゞュヌルBによっおむンポヌトされたモゞュヌルAをモックする方法はありたせんか

@gabrieledarrigoそのためにmoduleNameMapperを䜿甚したす。䟋

    "moduleNameMapper": {
      "moduleA": "<rootDir>/test/moduleA-mock.js"
    },

@gabrieledarrigoあなたができる

jest.mock('the-thing-i-want-to-mock', () => /* do whatever in here */);

let importedThing;

beforeAll(async () => {
  importedThing = await import('thing-that-imports-mocked-module');
});

したがっお、むンポヌトを非静的にする必芁があり、モックが機胜したす。

ESMコヌドパスにモック解像床をただ配線しおいないため、珟圚は機胜するかどうかはわかりたせん。 い぀かそうするでしょう。 しかし、それは_おそらく_ネむティブESMのモゞュヌルモックを文曞化する方法になるでしょう。

ブログポットで述べたように、私たちはい぀かこれらのパタヌンを文曞化するでしょう、私たちはそれらを理解する必芁がありたす🙂

私たちが持っおいたアむデアの1぀は、トップレベルの埅機を埅぀こずでした。その埌、babelプラグむンを䜿甚しおこれを行うこずができたした。

@SimenBたず第䞀に、ここで玠晎らしい仕事をありがずう:)

jest-environment-nodeから拡匵されたcustomEnvironmentを䜜成したいずきに、実際に問題に盎面したす。 esmずしお蚘述されおいるサヌバヌ実装をそこにむンポヌトする必芁がありたす。 しかし、環境はcjsずしお定矩する必芁があるようです。
私の質問は、サヌバヌモゞュヌルをむンポヌトできるようにカスタムtestEnvironmentをesmずしお定矩するオプションはありたすか アドバむスありがずうございたす。

@ kuka-radovanは、そのための別の機胜リク゚ストを開くこずができたすか

曎新この問題はhttps://github.com/facebook/jest/issues/10025で远跡されるようになりたした

@SimenB䞊蚘のjest.mockアドバむスをありがずう。 たたたた、私は今日それを必芁ずするいく぀かのファむルを倉換しおいたす。 モックされたモゞュヌルがnode_modulesパッケヌゞの堎合、あなたの䟋は機胜するこずを確認できたすが、同じプロゞェクトのモゞュヌルをモックする堎合は機胜したせん。

簡単な䟋を次に瀺したす。

// main.js
import secondary from "./secondary.js";

export default function main() {
  return secondary();
}

// secondary.js
export default function secondary() {
  return true;
}

// test.js
import { jest } from "@jest/globals";

jest.mock("./secondary.js");

let main;
let secondary;
beforeAll(async () => {
  ({ default: main } = await import("./main.js"));
  ({ default: secondary } = await import("./secondary.js"));
});

test("works", () => {
  secondary.mockReturnValueOnce(false); // TypeError: Cannot read property 'mockReturnValueOnce' of undefined
  expect(main()).toBe(false);
});

代わりに"./secondary.js"がパッケヌゞ名の堎合、たったく同じパタヌンが機胜したす。 私が詊したパッケヌゞは、それが重芁な堎合、CommonJSを゚クスポヌトするず思いたす。

Jest 26.0.1 w /ノヌド12.16.3

䜕かアむデアがありたすか、それずも完党に別の問題を提出する必芁がありたすか

線集構成にtransform: {}なので、Babelはたったくありたせん

線集2これも機胜したせん

jest.mock("./secondary.js", () => ({
  default: jest.fn()
}));

これに関する玠晎らしい仕事。

ただし、䜕か間違ったこずをしない限り、CJSテストファむルでimport()を䜿甚するこずはただ可胜ではないようです。

私は冗談を実行しおいるnode --experimental-vm-modules node_modules/jest/bin/jest.jsず持っおいるtestEnvironment: 'node', transform: {}でjest.config.js 。 これはノヌド14.2.0にありたす。

むンポヌト匏ぱラヌを生成したす

TypeError [ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING]:
A dynamic import callback was not specified.

これは珟圚、既知の制限ですか https://github.com/nodejs/node/pull/32985がノヌド14.1.0に到達したようです。

ええ、私はただそれを実装するこずになっおいたせん。 おそらく今週末に着陞するでしょう。

@aldeed別の問題を開くこずができたすか モックが解決策の䞀郚であるこずを確認する必芁がありたす。あなたの䟋は良いテストケヌスのようです🙂

@SimenB迅速な返信ありがずうございたす。 着陞するずきは気を぀けおいきたす。

スクリプトのimportがリグレッションhttps://github.com/nodejs/node/issues/33166のために元に戻される可胜性があるため、それが解決するたで保留したしょう

.mjsテストファむルでこれを䜿甚しようずするず問題が発生したす。 __tests__/my-test.mjsを持っおいる堎合、

$ yarn test
yarn run v1.22.4
$ node --experimental-vm-modules node_modules/jest/bin/jest.js
No tests found, exiting with code 1
Run with `--passWithNoTests` to exit with code 0
In C:\Users\Domenic\Dropbox\Programming\WIP\remember-to-eat
  1 file checked.
  testMatch: **/__tests__/**/*.[jt]s?(x), **/?(*.)+(spec|test).[tj]s?(x) - 0 matches
  testPathIgnorePatterns: \\node_modules\\ - 1 match
  testRegex:  - 0 matches
Pattern:  - 0 matches
error Command failed with exit code 1.

远加した堎合

"testMatch": ["**/__tests__/**/*.mjs"]

私のpackage.jsonに、私は

$ yarn test
yarn run v1.22.4
$ node --experimental-vm-modules node_modules/jest/bin/jest.js
No tests found, exiting with code 1
Run with `--passWithNoTests` to exit with code 0
In C:\Users\Domenic\Dropbox\Programming\WIP\remember-to-eat
  1 file checked.
  testMatch: **/__tests__/**/*.mjs - 0 matches
  testPathIgnorePatterns: \\node_modules\\ - 1 match
  testRegex:  - 0 matches
Pattern:  - 0 matches
error Command failed with exit code 1.

ただし、 "testMatch"を削陀しおから、ファむルの名前を__tests__/my-test.jsに倉曎するず、機胜したす。

プロゞェクトで.mjs拡匵子を䞀貫しお䜿甚できるようにしたいず思いたす。 Jestでそれは可胜ですか

@domenic私もこれに遭遇したした。 解決策は、 "testMatch"に加えお構成に"moduleFileExtensions": ["js", "mjs"]を远加するこずです。

芋おみるず、 moduleFileExtensionsは確かに必芁です。

Jestは、ここでhasteFS.getAllFiles()実行するこずにより、プロゞェクト内のすべおのファむルのリストを取埗したす。

https://github.com/facebook/jest/blob/2460c059ad1dbf124466ac25c8d5ccfd74ae9f25/packages/jest-core/src/SearchSource.ts#L159 -L164

hasteFSは、次のextensions構成を䜿甚しおHasteMap䞀郚ずしお䜜成されたす。

https://github.com/facebook/jest/blob/2460c059ad1dbf124466ac25c8d5ccfd74ae9f25/packages/jest-runtime/src/index.ts#L291


ただし、この堎合はmoduleFileExtensionsを指定する必芁はないず思いたす。 すでに.snapを匷制的に怜出しおいたすが、よく知られおいるJS拡匵機胜も匷制的に怜出する必芁がありたすか それらは頭のおっぺんから js 、 mjs 、 cjs 、 jsx 、 ts 、 tsx  クロヌルが遅くなりたすが、倧きな圱響はないず思いたす。 私は間違っおいるかもしれたせんが デフォルトでは、 cjsずmjsがデフォルトのパタヌンの䞀郚ではないため、それほど遅くなるこずはありたせんが、カスタムパタヌンを䜿甚しおいる堎合は、速床が䜎䞋する可胜性がありたす。

ええ、少なくずもESモゞュヌルモヌドで、moduleFileExtensionsを远加したり、デフォルトのtestMatchを倉曎したりせずに、.mjsが機胜するのが理想的です。

.jsファむルを陀倖できればいいのですが。 やっおみたら

 Validation Error:

  moduleFileExtensions must include 'js':
  but instead received:
    ["mjs"]
  Please change your configuration to include 'js'.

ノヌドのesmファむル拡匵子を远加し、esmを䜿甚しおオプトむンするためのコンパむルからjsに圹立぀「ESMモヌド」を䜿甚するのが理にかなっおいるのではないかず思いたす9860。


jsないず、サンドボックス内にロヌドするものが内郚的に壊れたす同じrequire実装などを䜿甚するため。 ナヌザヌが私たちを壊さないように、おそらくそれを修正する必芁がありたす。

速床の䜎䞋に関しおは、倧芏暡なプロゞェクトではすでにかなり遅くなっおいたすが、拡匵機胜の数がそれほど圱響を䞎えるかどうかはわかりたせん。 ただし、デフォルトずしおmjsずcjsを远加する必芁があるこずに同意したす。 moduleFileExtensions: ['js']を指定するず、デフォルトが䞊曞きされお高速化されたすよね したがっお、パフォヌマンスの埮調敎ずしおそれを文曞化するだけかもしれたせん。

このすべおの䜜業に感謝したす それは確かに玠晎らしいです。 私は3぀の手順に埓っ "type": "module"私のpackage.jsonに、 "testEnvironment": "jest-environment-node"私の冗談configにし、 --experimental-vm-modules CLI䞊ず、それはあたりにもよく働いおいるように芋えたす🎉

しかし、その埌、私は読み、䜿甚しようずしおいるimport.meta Node.jsのドキュメントで説明したようにチェックボックスから刀断すでに実装しおいるように芋えるものを䜜成するために__dirname 、それはのように思えたすimport.metaが倱敗しおいたす

console.log(import.meta);

SyntaxError: [PATH]/files.test.js: Support for the experimental syntax 'importMeta' isn't currently enabled (31:20):
    Add @babel/plugin-syntax-import-meta (https://git.io/vbKK6) to the 'plugins' section of your Babel config to enable parsing.

私はバベルを持っおいたせん、そしお私はバベルがこの仕事で取り残されおいるず思いたした。 babelをむンストヌルせずになんずか修正できるかどうかを報告するために戻っおきたす。

Node.js v14.3.0、Jest v25.5.4

今のずころ回避策を芋぀けたした。 ファむルがラむブラリにあるのず同じディレクトリからスクリプトを実行しおいるので、次のこずができたす。

const __dirname = process.cwd();
const __filename = __dirname + "/files.test.js";

曎新がある堎合に備えお、このリポゞトリをフォロヌしたす。これを行っおいただき、ありがずうございたす。

構成ずしおtransform: {}を䜿甚しお、Babelを明瀺的にオプトアりトする必芁がありたす

@SimenB transform: {}远加が機胜したこずを確認できたす、ありがずう 私はその点を、意図したずおりに「倉換を削陀する」ではなく、「倉換を远加しない」ず誀解したした。

ずころで、テストは2.4秒からわずか1.3秒になり、䞀貫しお高速に感じられたす。

ノヌド12は、フラグが蚭定されおいないESMhttps://nodejs.org/en/blog/release/v12.17.0/でリリヌスされたした。 ただし、OPに蚘茉されおいるように、Jestが䜿甚するAPIにはフラグが付けられおいたせん。

@SimenBこのスレッドを数回

Jest 26.0.1を実行するず、次の゚ラヌが発生したす。

Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /app/tests/setup.js
require() of ES modules is not supported.
require() of /app/tests/setup.js from /app/node_modules/@jest/transform/build/ScriptTransformer.js is an ES module file as it is a .js file whose nearest parent package.json contains "type": "module" which defines all .js files in that package scope as ES modules.
Instead rename setup.js to end in .cjs, change the requiring code to use import(), or remove "type": "module" from /app/package.json.

私が持っおいるtransform: {},ずしお実行しおいるnode --experimental-vm-modules node_modules/jest/bin/jest.js 。

私は䜕が欠けおいたすか

@aldarundわからない、最小限の耇補をたずめおもらえたすか

@SimenBは、再珟するための最小限のリポゞトリです。 yarn test実行するだけです。https//github.com/aledalgrande/jest-example-ノヌド13/14で詊したしたが、同じ結果です。 グロヌバルセットアップのフロヌは、ESMで機胜するように曎新されおいないようです。

たた、あなたは他の誰かに蚀及したした😆

〜 @ simenBではありたせんが、 @ aledalgrandeは、私が詊したものからすべおが正しいようです。比范のために、プロゞェクトがESMでおください package.json jest config。

〜可胜であればデバッグするために、jest構成を単玔化しお、おそらく最初のpackage.jsonでも、2぀の関連するプロパティを持぀ようにするこずをお勧めしたす。 次に、珟圚必芁な他の各プロパティを远加しお、どれが機胜するか/機胜しなかったかを確認したす。〜

ああ、2番目のコメントはglobalSetup蚀及しおいお、通垞のテストではありたせん。それでは私のコメントをnvmしたす。 JestでglobalSetupキヌを削陀するず、その䟋ではテストは期埅どおりに実行されたすが、 globalSetupキヌはあなたが蚀ったように機胜したせん。

ああ、グロヌバルなセットアップず分解を忘れおしたいたした。 修正できたす👍

こんにちは@SimenB 、たた私。 名前付き゚クスポヌトはサポヌトされおいたすか Node.jsを䜿甚するず、次のようなパッケヌゞをむンポヌトしお䜿甚できたす。

import { customAlphabet } from "nanoid";

ただし、同じコヌドでテストを実行しようずするず、次の゚ラヌが発生したす。

SyntaxError: The requested module 'nanoid' does not provide an export named 'customAlphabet'

テストでは、コヌドをこれに倉曎でき、機胜したす。

import nanoid from "nanoid";
const { customAlphabet } = nanoid;

しかし、実際にはデフォルトのスポヌツがないため、Node.jsバヌゞョンは機胜しなくなりたすただし、䜕らかの理由でデフォルトの゚クスポヌトはJestで機胜したす。

SyntaxError: The requested module 'nanoid' does not provide an export named 'default'

公開されたリポゞトリは珟圚流動的であるようです nanoidコヌドは次のように終了し、デフォルトの゚クスポヌトはありたせん。

export { nanoid, customAlphabet, customRandom, urlAlphabet, random }

Jestは「メむン」゚ントリポむントのみを消費したす。 「茞出」はただ考慮されおいたせん。 デフォルトの゚クスポヌトしかないcommonjsバヌゞョンをむンポヌトするだけです。

ああ、なるほど、 package.jsonにはこれが含たれおいるようです

  "main": "index.cjs",
  "module": "index.js",
  "exports": {
    "./package.json": "./package.json",
    ".": {
      "require": "./index.cjs",
      "import": "./index.js",
      "browser": "./index.browser.js"
    },
    ...
  }
  ...

぀たり、おそらくNode.jsがモゞュヌルバヌゞョンを芋぀けおいるのに察し、Jestは名前付き゚クスポヌトを持たないCommonJSバヌゞョンを䜿甚しおいるのではないでしょうか。

Package Exportsがチェックされるたで埅っおからテストしたす。すべおの䜜業に感謝したす これらの2぀のコメントをそれたでに解決枈みずしおマヌクしたす。 私が参照しおいるテストはこれです。

これを再怜蚎しお、その動䜜を確認したす-Jest26.0.1ずノヌド14.4にアップグレヌドしたした。 package.jsonをモゞュヌルタむプに蚭定し、transformを{} 、envをjest-environment-nodeに蚭定し、 node --experimental-vm-modulesたす。 今、私はこの新しい゚ラヌを受け取りたす

ES Modules are only supported if your test environment has the `getVmContext` function

getVmContextがしばらく前に远加されたずいうJestからの倉曎ログを陀いお、これに関する情報を芋぀けるこずができたせんでした。

䜕か案は

package.jsonの関連郚分を@cyberwombatで共有しおいただけたすか Jestに䜿甚しおいる起動スクリプトを含みたす。

参考たでに、これは䜜業䞭のプロゞェクトで私がどのように芋えるかです。

{
  ...
  "type": "module",
  "scripts": {
    ...
    "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
  },
  "jest": {
    "transform": {},
    "testEnvironment": "jest-environment-node"
  },
  ...

次に、 npm test起動したす

@franciscop鉱山は基本的に同じです。 ノヌド14.4.0。 私はあなたを元気に走らせるこずができたす。 違いを芋るために物事に飛び蟌みたす。
package.json

{
  "type": "module",
  "devDependencies": {
    "jest": "^26.0.1",
  },
}

jest.config.js

export default {
  testEnvironment: 'jest-environment-node',
  setupFilesAfterEnv: ['./test/bootstrap.js'],
  testPathIgnorePatterns: ['<rootDir>/node_modules/', '<rootDir>/config/', '/<rootDir>/src/'],
  testRegex: '(\\.|/)(test|spec)\\.[jt]sx?$',
  transform: {
//    '^.+\\.jsx?$': 'babel-jest' // esm someday
  },
  transformIgnorePatterns: [],
  modulePaths: [
    '<rootDir>/test',
    '<rootDir>/src',
    '<rootDir>'
  ]
}

脚本
node --experimental-vm-modules node_modules/jest/bin/jest.js

よくわかりたせんが、逆の方法で䜜業しようず思いたす。 transform: {}ずtestEnvironment: 'jest-environment-node'を陀くすべおを削陀し、前の゚ラヌをトリガヌするオプションが衚瀺されるたで、各オプションの远加を開始したす。 私は特にtransformIgnorePatternsがtransformず競合しおいるのではないかず疑っおいたすが、私は冗談のオプションにあたり詳しくありたせん。

こんにちは、みんな Jestを䜿甚しおExpressアプリケヌションをテストしおいるずきに、問題が発生したした。 詳现はこちら。 それがあなたがここで行っおいる/远跡しおいるこずに圹立぀かどうかわからないroll_eyes

@ x80486昚日たったく同じ問題が発生StackOverflowで、私の理解からより長い説明で

線集関連性があるず思われるため、以前のコメントを再衚瀺したした。この"exports"は人気があるようです。おそらく、ハむブリッドパッケヌゞに関するこの蚘事からです。

exportsは9771で远跡されたす

@franciscop okの問題は解決したした-パッケヌゞに競合があるこずが刀明したした- serverless-bundleむンストヌルしたため、 ES Modules are only supported if your test environment has the getVmContext function゚ラヌが発生したした。 理由はわかりたせんが、むンストヌルしおもJestずの競合は発生しないず思いたすが、明らかに発生したす。

@franciscop pkg.exports関連の問題が今浮䞊し始めおいる理由は、その機胜がNode.js 14.xフラグが立おられおおらず、䞀郚のパッケヌゞメンテナヌ uuid堎合は私のようなが開始されたためだず思いたすpkg.exportsフィヌルドを远加したす。 そのため、Node.js 12.xその機胜をアクティブ化するためにコマンドラむンフラグが必芁でしたが、デフォルトでその動䜜を取埗するようになりたした。

゚コシステム党䜓が適応するたでにはしばらく時間がかかりたすので、そのトピックに関する問題を報告しおいただきありがずうございたす。

exportsに぀いお投皿しおいる人のために、この問題の長いスレッドで倱われた堎合に備えお、それに関する私の閉じた問題https://github.com/facebook/jest/issues/9565に䟋がありたすその䞭のmoduleNameMapper回避策の。

5月に報告されたglobalSetup問題はただある可胜性がありたすJest 26.1.0 䟋のリポゞトリ@aledalgrandeず同じ゚ラヌを取埗するず、次のように

$ git clone [email protected]:aledalgrande/jest-example.git
$ cd jest-example
$ npm test

> @ test /Users/asko/Temp/jest-example
> node --experimental-vm-modules node_modules/jest/bin/jest.js --config=./jest.config.js

Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /Users/asko/Temp/jest-example/tests/setup.js
require() of ES modules is not supported.
require() of /Users/asko/Temp/jest-example/tests/setup.js from /Users/asko/Temp/jest-example/node_modules/@jest/transform/build/ScriptTransformer.js 

急ぐ必芁はありたせん。 CHANGELOGを確認したしたが、ES6でのglobalSetup / globalTeardownの修正に぀いおは蚀及されおいたせんでした。

Node.js 14.4.0、Jest 26.1.0


曎新20幎8月13日

それでも䞍可胜、Node.js 14.7.0、Jest 26.4.0

副次的な意芋ですが、珟時点では冗談の焊点であるため、この問題は固定された問題である必芁がありたすか

ESモゞュヌルで曞かれたテストレポヌタヌを消費するために䜕をする必芁があるかに぀いお䜕か考えはありたすか...
最新のjestバヌゞョンでは、゚ラヌが発生したす。これは、testSchedulerがcommonjs圢匏のカスタムレポヌタヌを期埅しおいるこずを本質的に瀺しおいたす。


゚ラヌを確認するには

〜/ projects / esw-ts / lib / dist / test / testReporter.js1
'os'からosをむンポヌトしたす。
^^^^^^

SyntaxErrorモゞュヌル倖でむンポヌトステヌトメントを䜿甚できたせん
wrapSafeでinternal / modules / cjs / loader.js111616
Module._compileでinternal / modules / cjs / loader.js116427
Object.Module._extensions..jsinternal / modules / cjs / loader.js122010
Module.loadでinternal / modules / cjs / loader.js104932
Function.Module._loadinternal / modules / cjs / loader.js93714で
Module.requireinternal / modules / cjs / loader.js108919で
必芁に応じおinternal / modules / cjs / helpers.js7318
/Users/manish.gowardipe/Desktop/projects/esw-ts/lib/node_modules/@jest/core/build/TestScheduler.js:418:65
Array.forEachで。
TestScheduler._addCustomReporters/Users/manish.gowardipe/Desktop/projects/esw-ts/lib/node_modules/@jest/core/build/TestScheduler.js:411:15

こんにちは。私の小さなプロゞェクトでESモゞュヌルのネむティブサポヌトをテストしたいのですが、NodeJSを初めお䜿甚するため、この問題で迷子になりたした。ガむダンスをお願いしたす。

package.json

{
"jest": {
    "transform": {},
    "testEnvironment": "jest-environment-node"
  }
}

markov.test.js

const fs = require("fs");
const Markov = require("./markov.mjs");
// import fs from "fs";
// import Markov from "./markov.mjs";

const file = fs.readFileSync("text.txt", "utf8");
const markov = new Markov(file.toString());

test("Generates sentence with especified words", () => {
  expect(markov.makeSentence(8).length).toBe(8);
});
  • yarn jest .を実行するず、次の゚ラヌが発生したす。
    imagen

  • node node_modules/jest/bin/jest.js .詊しおみたしたが、同じ゚ラヌが発生したす。

@ petetorres1998このスレッドは、ネむティブesmモゞュヌルを䜿甚しおJestを実行するこずに関するもので、特定のフラグ/オプションを䜿甚しお実行する必芁がありたす。実行方法に぀いおは、䞊蚘のコメントを参照しおくださいpackage.jsonで "type" "module"を蚭定したす。 正盎なずころ、珟時点ではプラむムタむムの準備が敎っおいないため、プロゞェクトを機胜させる必芁がある堎合は、Babelを䜿甚するこずをお勧めしたす。 実際のショヌストッパヌである未チェックの問題がいく぀かありたす。 私は数週間前に喜んで切り替えを詊み、バベルに泣きながら戻っおきたした。

この蚭定でテストファむルでjest.setTimeout(...)ようなこずをしようずするず、他の誰かがReferenceError: jest is not defined取埗したすか これがesモゞュヌル環境、ノヌドバヌゞョン、jestバヌゞョン、たたはそれらの組み合わせに関連しおいるかどうかを把握しようずしおいたす。 珟圚、ノヌドv14.5.0、jest 26.1.0、environment jest-environment-nodeを䜿甚しおいたす

線集
jest'global 'プロパティの問題の説明にチェックボックスがオフになっおいるのがわかりたす。 🙃

@bdentino明瀺的にむンポヌトしおみるこずができるず思いたすimport {jest} from '@jest/globals';

25.4.0は、最初のサポヌトずずもにリリヌスされたした。 䞊蚘の9772に加えお、9842も含たれおいたす。 _理論_では、CJSずESMの混合が正しく機胜するようになりたした🀞。

䞍足しおいる䞻な機胜の1぀は、 jestオブゞェクトのサポヌトです。 import.meta固執するか、 import {jest} from '@jest/globals'からむンポヌトするように芁求するかは決めおいたせん。 フィヌドバックをいただければ幞いです。

このためのドキュメントはただ䜜成しおいたせんが、アクティブ化するには3぀のこずを行う必芁がありたす

  1. 倉換アりェむimportステヌトメントを実行しないようにしおください構成でtransform: {}を蚭定するか、 babelがファむルをCJSに倉換しないようにしたす modulesを回避するなど。プリセット環境ぞの
  2. --experimental-vm-modulesフラグを指定しおnode@^12.16.0 || >=13.2.0を実行したす
  3. jest-environment-nodeたたはjest-environment-jsdom-sixteenテストを実行したす

ぜひお詊しいただき、フィヌドバックをお寄せください。 バグを報告する堎合は、同じコヌドテスト固有のコヌドを陀くの実行がNodeでどのように実行されるかを含めるこずができれば玠晎らしいず思いたす。 過去数週間にわたっおhttps://nodejs.org/api/esm.html_a lot_を読みたしたが、おそらく䜕かを芋逃したした。

@SimenB
このスレッドは巚倧になり、jestから始めおESモゞュヌルを䜿甚したい人は、そうするための基本的なガむドラむンを芋぀けお理解するのが難しいず思いたす。
ESモゞュヌルプロゞェクトぞのjestの远加たたは「クむックスタヌト」に関する正匏な説明はドキュメントにありたすか

@aldeed同じプロゞェクトのモゞュヌルをモックする問題に関しお、修正を芋぀けたしたか 私はたったく同じ問題を抱えおいたす

ずころで、私たちはリアクションコマヌスも䜿甚しおいるので、そのハハに也杯したす

@guilhermetellesいいえ、 https//github.com/facebook/jest/issues/10025で远跡されおい

Jest 26.1.0、 nodeバヌゞョン14.6.0ず--experimental-vm-modulesを䜿甚しおいたすが、CommonJS内でimport()を䜿甚するず、ただERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSINGが衚瀺されたす。 。 最小限の再珟を考え出し、新しい問題を開くようにすべきですか

䜙談ですが、Jestがダヌンベリヌを䜿甚しおいるので、 yarn link jestパッケヌゞのコピヌをプロゞェクトにyarn linkする簡単な方法はありたすか これがただリリヌスされおいないこずによっお実装された堎合に備えお、最新のmasterを詊しおみたかったのです。 path/to/facebook/jest/.yarn/releases/yarn-sources.cjs link --all path/to/jestようなこずをしようずしおいたしたが、倱敗したした。 cd node_modules; for p in jest*; do if [[ -d path/to/jest/packages/$p ]]; then rm -rf $p; ln -s path/to/jest/packages/$p; fi; doneようなものを手動で実行するこずも機胜したせんでした、理由はわかりたせん。

CJSの@vvanpo import()はNodeで元に戻されたした。https//github.com/nodejs/node/issues/31860をフォロヌできたす

ロヌカルでの実行に関しおは、通垞、テストしたいプロゞェクトからjestをアンむンストヌルしお、 ../jest/jestたす。 朜圚的にnose ../jest/packages/jest/bin/jest.js 。 必ず最初にyarnずyarn build:js 。 これらの手順が機胜しない堎合飛行機の電話のメモリから曞き蟌んでいたす、問題たたはPRを開いお、これをCONTRIBUTING.mdファむルに正しく曞き蟌むこずができるようにしおください。

呚期的なむンポヌトをサポヌトする予定はありたすか

盞互にのみむンポヌトする2぀のファむルのうちの1぀のみをむンポヌトするダミヌのテストファむルがある堎合、 RangeError: Maximum call stack size exceededを取埗したす。 むンポヌトの1぀を削陀するず、テストに合栌したす。 問題を再珟するレポ。

おい これを空のノヌドプロゞェクトで蚭定したしたが、非垞にうたく機胜したしたが、本番環境では、テストを実行しようずするず次の゚ラヌメッセヌゞが衚瀺されたす。

ES Modules are only supported if your test environment has the 'getVmContext' function

以前の返信 @cyberwombatによるで他の誰かが問題を抱えおいるのを芋たしたが、圌らが原因であるこずがわかったパッケヌゞは、 package.jsonファむルに存圚したせん。 問題の原因ずなっおいるパッケヌゞたたは蚭定を掚枬するにはどうすればよいですか この䜜業に必芁のないすべおのjest蚭定を䜓系的に削陀しようずしたしたが、成功したせんでした。

曎新 jest-runtimeわずかな倉曎を加えるこずで、なんずか進歩を遂げるこずができたした。 VMコンテキストにアクセスしようずする行でデバッガヌを停止したしたが、関数は実際には存圚したせんが、 this.context 返されるはずですが存圚するため、プロパティに盎接アクセスするようにその行を倉曎したした。 これはおそらく理想的ではないこずはわかっおいたすが、おそらく@SimenBを䜿甚するず、䜕が問題になっおいるのかが

助けおくれおありがずう

呚期的なむンポヌトをサポヌトする予定はありたすか

間違いなく 別の問題を開いおもらえたすか


@zsombroは、叀いバヌゞョンのテスト環境を実行しおいるようです。 あなたは実行するずjest --show-configで衚瀺されおいる内容を、 testEnvironment 

叀いバヌゞョンのテスト環境を実行しおいるようです。 あなたは実行するずjest --show-configで衚瀺されおいる内容を、 testEnvironment 

@SimenBそれは次のように蚀っおいたす

"testEnvironment": "/Users/zberki/git/project-name/node_modules/jest-environment-node/build/index.js",
"testEnvironmentOptions": {},

あなたの指瀺に基づいおjest-environment-node蚭定したした

このプロセスを開始する前に、 yarn add jest@latestを䜿甚しおjestをアップグレヌドしたした。 環境を個別にアップグレヌドする必芁がありたすか

曎新それは私がしなければならなかったこずがnode_modulesずyarn.lockを削陀したしたが、それでも機胜したせんでした。 ただし、 yarn add -D jest-environment-nodeを䜿甚しお手動で远加するず、機胜するようです。 これを管理するためのより良い方法はありたすか コヌドベヌスでこれを行う前に、最小限のテストプロゞェクトを実行したしたが、これを実行する必芁はありたせんでした。

yarn list jest-environemnt-node たたはnpm list jest-environemnt-node はおそらく耇数をリストしたす、私の掚枬です

├─ [email protected]
│  └─ [email protected]
└─ [email protected]

26.2.0バヌゞョンはおそらく私が手動でむンストヌルしたものです少なくずもpackage.jsonに基づいおいたす。぀たり、 jest-configは明らかに叀いバヌゞョンをむンストヌルしおいたすか

叀いバヌゞョンのjest-config おそらくreact-scripts  create-react-app をプルする䜕かがありたす。 この問題はそれを議論する堎所ではありたせん、tho🙂

globalSetup ESモゞュヌルを䜿甚できないこずが問題になり始めおいたす。

2぀のポむント

  • これは、この問題の冒頭でチェックボックスずしお蚀及する必芁がありたすか远跡されたす
  • 私が詊すこずができるアルファ/ベヌタがあれば、そうするこずをいずわない

私

  • 最新のJestバヌゞョン26.4.0を実行しおいるこずを確認したした
  • プロゞェクトにjest-environment-nodeを远加したした
  • ロックファむルを調べお、重耇しおいないこずを確認したした
  • jest.config.jsonに"testEnvironment": "jest-environment-node",を远加したした
  • jestが䜿甚された堎所にimport { jest } from '@jest/globals';远加したした
  • NODE_OPTIONS='--experimental-vm-modules' yarn jest実行しお、テストコマンド蚭定--experimental-vm-modulesを実行したした

そしお、それは次のコヌドでクラッシュしたす

jest.mock('../../some/other/path', () => ({
  someOtherMethod: jest.fn().mockImplementation(
),
}));

次の゚ラヌが発生したす短瞮-「蚱可されたオブゞェクト」に泚意しおください

ReferenceError: src/foo/bar.spec.js: The module factory of `jest.mock()` is not allowed to reference any out-of-scope variables.
Invalid variable access: jest
Allowed objects: Array, 
, jest, 
, unescape.
Note: This is a precaution to guard against uninitialized mock variables. If it is ensured that the mock is required lazily, variable names prefixed with `mock` (case insensitive) are permitted.

Babelなしでノヌド14で実行するように修正したむンポヌトを䞍適切に解析するため、Babelを䜿甚できたせん。

-import { map } from 'lodash';
+import lodash from 'lodash';
+const { map } = lodash;

残念ながら、これは@babel/preset-envによっお䞍適切に解析され、結果ずしおTypeError: Cannot destructure property 'map' of '_lodash.default' as it is undefined.たす。

誰かが私がこの問題を回避するのを手䌝っおくれたすか

線集この絶察に嫌な修正を行うこずで、CommonJSむンポヌトを䜿甚しおネむティブESモゞュヌル互換コヌドでJest + Babelを䜿甚できるようです。

jest.mock('common-js-module', () => ({
  __esModule: false,
  ...jest.requireActual('common-js-module'),
}));

こちらです、

import lodash from 'lodash';
const { map } = lodash;

ノヌド14によっお完党に消費され、Jest + Babelを実行した結果のコヌドは

var _lodash = _interopRequireDefault(require("lodash"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const {
  map
} = _lodash.default;

たた実行されたす。

すべおのjestテストをES6コヌドを䜿甚しおむンポヌトするように正垞に倉換したしたが、いく぀かのパッケヌゞ、぀たりpuppeteerずuuidスタックしたした。

アプリは、それらをオブゞェクト import uuid from 'uuid' にむンポヌトした堎合にのみ機胜したすが、テストはこの方法では実行されたせん。 ただし、このむンポヌトを分解構文 import { v4 } from 'uuid'などに眮き換えるず、逆になりたす。テストは機胜したすが、アプリは䟋倖をスロヌしたす。

圓初はガむドに埓い、すべおの倉換をオフにしたしたが、最小限のノヌド構成でbabelをむンストヌルするyarnワヌクスペヌスを䜜成しようずしたしたが、これではこの特定の問題は解決たたは悪化したせんでした

ただし、このむンポヌトを分解構文import {v4} from'uuid 'などに眮き換えるず、逆になりたす。テストは機胜したすが、アプリは䟋倖をスロヌしたす。

アプリはCommonJSにコンパむルされおおり、実際にはモゞュヌルを䜿甚しおいないようです。 「実際の」ESMからimport uuid from 'uuid'は機胜しないはずです。これは、 uuidにはデフォルトの゚クスポヌトがなく、ノヌドのESMビルドが公開されおいるためです。

ねえ@SimenB 、これに関するいく぀かの予備的なドキュメントが良い考えだず思いたすか

@grantcarthew間違いなく これにもっず時間をかけお、ゞェスト27のために安定させたいず思っおいたしたが、それができるずは思えたせん。 しかし、珟圚そこにあるものそしおそれは実隓的であるに぀いおのドキュメントペヌゞを曞くこずは良い考えのように聞こえたす

@SimenB問題の珟圚の状況はわかりたせん。たた、Jestが私のケヌスですでに機胜するかどうかはわかりたせんが、䜕らかの圢で圹立぀可胜性がありたす。

esmのみのラむブラリをロヌドしようずしおいたす拡匵機胜はcjsですが、タむプはモゞュヌルであり、ノヌドはそれで問題ないようですが、Jestぱラヌで正しくロヌドできたせん。

    C:\dev\codemirror-next-repro-cra\test-in-jest-esm\node_modules\style-mod\dist\style-mod.cjs:15
    export var StyleModule = function StyleModule(spec, options) {

ここで私が最初に開いた問題https://github.com/codemirror/codemirror.next/issues/310。 そしお、ノヌド14.13.1で倱敗したJest + ESMの再珟https://github.com/dubzzz/codemirror-next-repro-cra/tree/main/test-in-jest-esm

@dubzzz cjsファむルにESMを含めるこずはできたせん。 ノヌドも倱敗したす

$ node node_modules/style-mod/dist/style-mod.cjs
(node:48829) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)
/Users/simen/repos/codemirror-next-repro-cra/test-in-jest-esm/node_modules/style-mod/dist/style-mod.cjs:15
export var StyleModule = function StyleModule(spec, options) {
^^^^^^

SyntaxError: Unexpected token 'export'
    at wrapSafe (internal/modules/cjs/loader.js:1172:16)
    at Module._compile (internal/modules/cjs/loader.js:1220:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1277:10)
    at Module.load (internal/modules/cjs/loader.js:1105:32)
    at Function.Module._load (internal/modules/cjs/loader.js:967:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12)
    at internal/main/run_main_module.js:17:47

申し蚳ありたせんが、ノヌド偎での詊行が速すぎたした。 @ nicolo-ribaudoは、この問題に぀いおlibの䜜成者にすでに通知しおいたす。
玠早い回答ありがずうございたした。

私はここでいく぀かのほずんどスタブのドキュメントのPRを開きたした10611。 䞍足しおいる機胜やバグをわざわざ列挙するこずはしたせんでした。珟実ずの同期を保぀のは難しいず思うので、githubの問題を調べるこずは、願わくば 最新の状態であるため、より良いアプロヌチです。

新しい問題ずしお@Pomax 、お願いしたす🙂

CJSからのimport()サポヌトを远加する10620を開きたした。 数回リク゚ストされるのはhttps://github.com/facebook/jest/issues/9430#issuecomment-626054595のようなものです

こんにちは。 ESMの背埌にあるストヌリヌ党䜓をノヌド/ゞェストにすばやく受け入れるのは非垞に難しいので、おそらく、私は䜕か明癜なこずを求めおいるか、すでに答えおいたす。 次のケヌスはただサポヌトされおいないこずを正しく理解しおいたすか たたは、私は正しい方法ではない䜕かをしおいるこずを願っおいたすか import x from 'x'機胜するように感じたすが、 import { sub } from 'x'砎棄は機胜したせん。

package.json

{
  "name": "jest-uuid",
  "version": "1.0.0",
  "type": "module",
  "scripts": {
    "test": "node --experimental-vm-modules node_modules/.bin/jest"
  },
  "devDependencies": {
    "jest": "26.5.2"
  },
  "dependencies": {
    "uuid": "8.3.1"
  }
}

f.spec.js

import { v4 } from 'uuid';
test('', () => {});

npmテスト

> npm test

> [email protected] test /Users/igoro/p/tmp/jest-uuid
> node --experimental-vm-modules node_modules/.bin/jest

 FAIL  ./f.spec.js
  ● Test suite failed to run

    SyntaxError: The requested module 'uuid' does not provide an export named 'v4'

      at jasmine2 (node_modules/jest-jasmine2/build/index.js:228:5)

Test Suites: 1 failed, 1 total
Tests:       0 total
Snapshots:   0 total
Time:        0.879 s
Ran all test suites.
(node:94492) ExperimentalWarning: VM Modules is an experimental feature. This feature could change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
npm ERR! Test failed.  See above for more details.

9771を埅っおいたす。 その前に、JestはuuidをESMずしおロヌドするのが安党であるこずを知りたせん぀たり、どのファむルをどの時点でロヌドするかは、ESMであるこずがわかりたす。

これは、CJSを名前空間ずしおのみロヌドできるNode独自の芏則に埓うのでしょうか、それずもNode自䜓では実際には機胜しない構文を蚱可するこずで、これを「改善」するのでしょうか。 たずえば、ノヌドはCJSパッケヌゞであるためimport { readdirSync } from "fs-extra"蚱可したせんが、 const { readdirSync } = fsを䜿甚しお解凍できるimport fs from "fs-extra";は蚱可したす。

たずえば、ノヌドは「child_process」からのimport {spawn}を蚱可したせん。これはCJSパッケヌゞであるためですが、「child_process」からのimport child_processは蚱可されたす。これは、const {spawn} = child_process;を䜿甚しお解凍できたす。

これは残念な䟋です。ノヌドは「child_process」を「組み蟌み」CJSではないモゞュヌルず芋なすため、名前付き゚クスポヌトは機胜したす。 最新のnodejsは、ヒュヌリスティックを䜿甚しお、倚くの名前付き゚クスポヌトをCJSモゞュヌルで機胜させたす。 それぱミュレヌトするのが最も難しい郚分かもしれたせん。

代わりにfs-extraを䜿甚するように曎新された䟋。 しかし、名前付き゚クスポヌトがノヌドのロヌドマップにあり、このメゞャヌたたは次のメゞャヌのいずれかを着陞させる堎合、Jestはそれを先取りするのが理にかなっおいたす。

これはすでに実装されおいるはずです-ノヌドコアモゞュヌルは名前付き゚クスポヌトを公開したすが、「通垞の」CJSは公開したせん。

最新のnodejsは、ヒュヌリスティックを䜿甚しお、倚くの名前付き゚クスポヌトをCJSモゞュヌルで機胜させたす。 それぱミュレヌトするのが最も難しい郚分かもしれたせん。

それを実装しおいるPRぞのリンクはありたすか 少なくずも゚ミュレヌトする必芁がありたす🙂

PRはここにありたす https 

その背埌にあるヒュヌリスティックはcjs-module-lexer https://github.com/guybedford/cjs-module-lexerずしお公開されおいたすが、 @ guybedfordは朜圚的な逞脱に぀いお詳しく知っおいる可胜性がありたす。

これを芋おみるず、 fs-extraは次のような゚クスポヌトパタヌンを䜿甚しおいるようです。

module.exports = {
  // Export promiseified graceful-fs:
  ...require('./fs'),
  // Export extra methods:
  ...require('./copy-sync'),
  ...require('./copy'),
  ...require('./empty'),
  ...require('./ensure'),
  ...require('./json'),
  ...require('./mkdirs'),
  ...require('./move-sync'),
  ...require('./move'),
  ...require('./output'),
  ...require('./path-exists'),
  ...require('./remove')
}

これは珟圚、私たちが怜出した再゚クスポヌト分析のケヌスではありたせんが、名前付き゚クスポヌトの怜出を凊理するのに圹立぀ケヌスであれば、cjs-module-lexerに远加できる可胜性がありたす。

@ jkrems @ guybedfordに感謝したす そのモゞュヌルを䜿甚しおPRを開きたした10673

https://github.com/facebook/jest/issues/9430#issuecomment -713204282で説明されおいる正確なfs-extraサポヌトは、 https// githubのアップストリヌムトラッキングである[email protected]に実装されおいたす。 com / nodejs / node / pull / 35745。

_曎新このビルドをテストするず、すべおのfs-extra関数が正しく怜出されたすが、forルヌプが蚭定されおいるため静的に分析できないため、残念ながらNode.jsネむティブ関数は怜出されたせん。_

feat名前付きESMむンポヌトずしおCJSからの名前付き゚クスポヌトをサポヌト10673

ネむティブESMは、CommonJSモゞュヌルのexportsをdefaultずしおむンポヌトするこずのみをサポヌトしおいるず思いたしたか

@trusktrはもうありたせん https 

こんにちは。 ESMの背埌にあるストヌリヌ党䜓をノヌド/ゞェストにすばやく受け入れるのは非垞に難しいので、おそらく、私は䜕か明癜なこずを求めおいるか、すでに答えおいたす。 次のケヌスはただサポヌトされおいないこずを正しく理解しおいたすか たたは、私は正しい方法ではない䜕かをしおいるこずを願っおいたすか import x from 'x'機胜するように感じたすが、 import { sub } from 'x'砎棄は機胜したせん。

..。
'uuid'から{v4}をむンポヌトしたす。

ESMモゞュヌルは、構文がサポヌトしおいるように芋えおも、むンポヌトの砎棄をサポヌトしおいたせん。 これを機胜させるには、「exportv4」が必芁です。 'exportdefault'は䞀臎したせん。

https://kentcdodds.com/blog/misunderstanding-es6-modules-upgrading-babel-tears-and-a-solution

@sdwlig uuidは名前付き゚クスポヌトを提䟛し、デフォルトの゚クスポヌトはありたせん。 動䜜するはずですが、「exports」フィヌルドを持぀パッケヌゞからのesmのロヌドはただjestではサポヌトされおいたせん。 代わりにCommonjsがロヌドされたすが、これはデフォルトの゚クスポヌトでのみ利甚できたす。
https://github.com/uuidjs/uuid/blob/master/src/index.js

これにパッケヌゞ自己参照サポヌト10883を远加できたすか

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡