iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 16
3
自我挑戰組

中年失業大叔的耍廢日記系列 第 16

第十六天:放晴的中秋節還是要用功啊(假設)

昨天太晚睡,早上十點才真正起床XD,好廢...

其實是想吃烤肉又懶得烤,所以半夜兩點跑出去買,然後早上六點吃了烤肉又繼續睡,果然是真廢...

想要奮發,不過筆電沒電了,出門前先充個電吧...充完電前先寫一段文...好想喝咖啡阿,只是下午還得拜拜,所以出門喝咖啡也不能太久,不管他了。

一直有事出不了門阿~~在家裡試了一下jest跟mocha。

大概是為了能處理jsx?jest是自己去剖析測試程式碼,所以當他不支援ES6+時,就需要做前置處理(例如Babel)。

我自己是都在用mocha,mocha是透過node或瀏覽器環境來跑測試程式,所以只要環境支援ES6+,就不是問題。

寫了一些ES6 Module,node.js在第14版應該就可以不加option就支援ES6 Module,所以裝了試試看。

node.js環境為了能支援common.js module及ES6 module,訂了幾個規則:

  1. 預設的模組支援是common.js,副檔名是.js
  2. 副檔名是.cjs則一定是common.js module
  3. 副檔名是.mjs則一定是ES6 module
  4. 透過package.json可以設定預設的模組支援方式,加上{"type":"module"}的話,預設就是ES6 module

不過目前還是在青黃不接,一些node.js模組還只支援CommonJS module,雖然node.js允許用ES import語法來載入CommonJS模組,但是有點跛腳...或是我搞錯什麼XD

從jest start guide偷來sum.js

export default sum;

function sum(a, b) {
    return a + b;
}

然後寫測試test/sum.js

import sum from "../sum.js";
import { assert } from "chai";


it('adds 1 + 2 to equal 3', () => {
    assert(sum(1,2)===3, 'not equal');
});

馬上報錯:

import { assert } from "chai";
         ^^^^^^
SyntaxError: Named export 'assert' not found. The requested module 'chai' is a CommonJS module, which may not support all module.exports as named exports.
CommonJS modules can always be imported via the default export, for example using:

import pkg from 'chai';
const {assert} = pkg;

    at ModuleJob._instantiate (internal/modules/esm/module_job.js:98:21)
    at async ModuleJob.run (internal/modules/esm/module_job.js:143:5)
    at async Loader.import (internal/modules/esm/loader.js:165:24)
    at async Object.exports.loadFilesAsync (H:\builds\jests\node_modules\mocha\lib\esm-utils.js:33:20)
    at async singleRun (H:\builds\jests\node_modules\mocha\lib\cli\run-helpers.js:156:3)
    at async Object.exports.handler (H:\builds\jests\node_modules\mocha\lib\cli\run.js:366:5)
npm ERR! Test failed.  See above for more details.

怪...試了一下各種可能性,比較好的解法:

import sum from "../sum.js";
import defaultExport from "chai";
const { assert } = defaultExport;

it('adds 1 + 2 to equal 3', () => {
    assert(sum(1,2)===3, 'not equal');
});

問題是如果多個模組要import,要重複使用defualtExport好像也怪怪的,另一個做法:

import sum from "../sum.js";
import * as _chai from "chai";
const { assert } = _chai['default'];

it('adds 1 + 2 to equal 3', () => {
    assert(sum(1,2)===3, 'not equal');
});

這是用console.log(_chai)看了一下載入的東西發現的,default是Javascript關鍵字,用起來很麻煩說,也許node.js可以調整一下名稱XD

回頭看了一下chai的github,master目前已經加上ES6 Module的支援,但是...最新發行的版本還沒有...好吧

今天中秋節,用功就到這裡為止,出門溜達去~~


上一篇
第十五天:又是陰雨的週三
下一篇
第十七天:連假於我如浮雲的週五
系列文
中年失業大叔的耍廢日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

我要留言

立即登入留言