簡體   English   中英

嘗試通過 --experimental-loader 選項使用 mocha、ES6 模塊和 ts-node

[英]Trying to use mocha, ES6 modules, and ts-node with the --experimental-loader option

我試圖讓 ts-node 選項--experimental-loader與 mocha 一起工作,但沒有運氣。 在我開始嘗試編譯 ES6 模塊之前,我曾經能夠以這種方式運行 mocha 測試:

"test": "nyc --reporter=html mocha --require ts-node/register src/**/*.spec.ts"

這在生成 ES6 模塊時不再起作用。

我會使用TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\" }'解決方案進行測試,但由於另一個復雜性,這對我不起作用:我生成 ES6 模塊作為第一步我的構建,使用 webpack 和 babel 生成 ES5/CommonJS 模塊。 除非我將.js添加到本地 TypeScript import語句的末尾,否則最后一步不起作用。

但是添加這些.js擴展名會破壞TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\" }'解決方案,但是,如果我返回 go 並刪除所有.js擴展名,則該解決方案將起作用。 我顯然不想要一個測試和構建過程,我必須在添加和刪除這些擴展之間來回切換。

為了簡化現在,我已經刪除了 nyc,並且我正在嘗試運行這樣的測試:

mocha -r ts-node/register --experimental-loader ./ts-loader.mjs src/**/*.spec.ts

這樣我沒有錯誤,但也沒有任何反應。 就像src/**/*.spec.ts不存在一樣。

我的無所事事(目前)虛擬加載程序如下所示:

console.log('ts-loader loaded');

export async function resolve(specifier, context, defaultResolve) {
  console.log('resolve');
  return defaultResolve(specifier, context, defaultResolve);
}

export async function getFormat(url, context, defaultGetFormat) {
  console.log('getFormat');
  return defaultGetFormat(url, context, defaultGetFormat);
}

export async function getSource(url, context, defaultGetSource) {
  console.log('getSource');
  return defaultGetSource(url, context, defaultGetSource);
}

export async function transformSource(source, context, defaultTransformSource) {
  console.log('transformSource');
  return defaultTransformSource(source, context, defaultTransformSource);
}

export function getGlobalPreloadCode() {
  console.log('getGlobalPreloadCode');
  return '';
}

我可以告訴它已加載,因為出現了'ts-loader loaded'消息,但沒有一個函數被調用。

我嘗試了其他排列,但只是得到像src/**/*.spec.ts這樣的錯誤被視為文字文件名而不是 glob,或者關於未找到模塊的錯誤。

我希望看到我的加載程序在處理每個import時都被調用,然后弄清楚如何操作文件擴展名,但我還沒有做到這一點。 有什么建議么?

我正在使用節點 v14.15.1。 可以在此處找到我的項目的完整代碼,其中包含有效的構建,但測試失敗: https://github.com/kshetline/tubular_math

我終於找到了一個解決方案,雖然它不是我最初尋找的路線。 我放棄了嘗試讓 mocha 對額外的.js擴展感到滿意,並找到了一種方法讓 webpack 在沒有它們的情況下感到滿意。 所以...

import { Angle, Mode, Unit } from './angle.js';

……回到……

import { Angle, Mode, Unit } from './angle';

我的測試腳本如下所示:

  "scripts": {
    "build": "rimraf dist/ && tsc && webpack && webpack --env target=umd",
    "prepublishOnly": "npm run build",
    "lint": "eslint 'src/**/*.ts'",
    "test": "TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' nyc --reporter=html mocha --require ts-node/register src/**/*.spec.ts"
  },

最后,最重要的是,我想出了如何使 webpack 5.x(4.x 沒有這個問題)對沒有.js擴展名的本地 JavaScript 進口感到滿意,否則 Z424516CA53B4AD4BEF837EDA 現在堅持package.json"type": "module"

    module: {
      rules: [
        { test: /\.js$/, use: 'babel-loader', resolve: { fullySpecified: false } }
      ]
    }

...將fullySpecified設置為false 是解決方案的關鍵。

更新:上面的示例是在一個故意簡單的項目上完成的,對於初學者來說很容易生成帶有 ESM 模塊的 npm package。 現在我正在嘗試一些更高級的東西,我再次遇到了運行單元測試的障礙。 一旦 *.spec.ts 文件直接或間接導入外部代碼,模塊加載就會失敗。 在弄清楚如何解決該問題之前,我只能測試沒有外部依賴項的代碼。 顯然使用"TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}'只是讓我 go 深入解決與 ts-node 一起運行 mocha 的基本問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM