common mistake
ã©ãã«ã䜿çšããŠåé¡ãçžäºåç
§ããããšã«ãããåé¡ããŸã æåºãããŠããªãããšã確èªããŸããnode node_modules/.bin/mocha --version
ïŒããŒã«ã«ïŒããã³mocha --version
ïŒã°ããŒãã«ïŒã ã°ããŒãã«ã«ã€ã³ã¹ããŒã«ãããã¢ã«ã®äœ¿çšãé¿ããããšããå§ãããŸããå§ããåã«ããã®ãããã¯ã«é¢ããŠãã§ã«ããã€ãã®è§£æ±ºæžã¿ã®åé¡ããããŸãããåææ¡ä»¶ãå€æŽããããããæ°ããè©Šã¿ãéå§ããããšæããŸãã
ããŒããEMCAScriptã¢ãžã¥ãŒã«ã®å®è¡ããµããŒãããããã«ãªã£ãã®ã§ïŒã¯ããå®éšçã§ããããšãããããŸãïŒãmochaãmjs
ãã¹ãå®çŸ©ãšé£æºããŠåäœããã®ãèŠãã®ã¯çŽ æŽãããããšã§ãã
ãšãŠãç°¡åãªãã¹ãããããŸã
describe('Test', function () {
});
test.js
ãštest.mjs
ãšããŠä¿åãããã®
æåŸ ãããåäœïŒäž¡æ¹ã®ãã¹ãã§è¡šç€ºããã
- test/test.js
0 passing (1ms)
(node:70422) ExperimentalWarning: The ESM module loader is experimental.
å®éã®åäœïŒ js
ãã¹ãã¯æ©èœããŸããã mjs
ãã¹ãã§ã¯
- test/test.mjs
module.js:658
throw new errors.Error('ERR_REQUIRE_ESM', filename);
^
Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /Users/dgehl/Repositories/LOreal/code/ecom-lora/test/frontend/components/global/test.mjs
åçŸé »åºŠïŒ 100ïŒ
node --version
-v8.5.0
mocha --version
-3.5.3
ããã¯ãmochaã®ã©ã³ããŒãcommonjsã䜿çšããŠãããnodejsã®çŸåšã®å®è£ ã§ã¯commonjsã³ã³ããã¹ãããã®ECMAScriptã¢ãžã¥ãŒã«ã®äœ¿çšãèš±å¯ãããŠããªãå¯èœæ§ããããšæããŸãã
ããã©ã³ã¹ãã€ã©ãŒã䜿çšããããšè¿ä¿¡ããªãã§ãã ãããæ瀺çã«äœ¿çšããªãããã«ããŸãã
ç·šéïŒä»¥åã®ããŒãžã§ã³ã§ã¯ã誀ã£ãŠmjsã®ä»£ããã«jsxã䜿çšããŠããŸããã
ããã«èª¿æ»ãè¡ãåã®ãé ã®ãŠã£ãºãããã®æåã®èãïŒ
node --experimental-modules node_modules/mocha/bin/_mocha
ã®ããã«å®è¡ããããšæããŸããïŒ.jsx
ã¯ã©ã®çšåºŠæ£ç¢ºã«é¢ä¿ããŠããŸããïŒ ç€ºãããŠãããšã©ãŒã®äŸã¯.mjs
ãåç
§ããŠããããšãããããŸãã æçš¿ãããå
容ããã jsx
ãã©ãã«ãããã¯äžæã§ãã.mjs
ãã¡ã€ã«æ¡åŒµåãå¿
èŠãšããNodeã®æåã®å®è£
ã«ã€ããŠèããããšãæŒ ç¶ãšæãåºããŸãã ãããïŒãŸã ïŒïŒæ¬åœã§ããã import
/ export
ã.jsx
ãã¡ã€ã«ã§äœ¿çšããããšããŠããå ŽåïŒ import
.jsx
ããããïŒ .mjs
ãã¡ã€ã«ã«å
¥ãããã$ import
/ export
ãå«ã$ .jsx
ãã¡ã€ã«ãããŒãããå Žåããããã¢ã«ã§ã¯ãªãåé¡ã«ãªãå¯èœæ§ããããŸããïŒç§ã¯ãNodeã®äººã ãCommonJSã¢ãžã¥ãŒã«ãšã®äžäœäºææ§ãå¯èœã«ããããã«ç¹ã«æšæºãå€æŽããããšãæãåºããŠããããã§ãã ãããïŒãŸã ïŒïŒæ¬åœãªããã¢ã«ãšäžç·ã«/ã¢ã«ã«å¯ŸããŠäœãããå¿ èŠãªãã«ãæçµçã«ã¯ãµããŒãããããšæããŸãã ïŒãããŠããæçµçã«ããšã¯ãããŒãã®ãªãªãŒã¹ãµã€ã¯ã«ã®é床ãèãããšããã¢ã«ã®å€æŽãããããããããã«éãããšããæå³ã§ããããã«ã€ããŠã®è©³çŽ°ãªèª¬æã«ã€ããŠã¯ã以äžã®åŒ·èª¿ãããæåŸãã2çªç®ãåç §ããŠãã ãããïŒ
ç§ã®ïŒå°ãã®ïŒèª¿æ»ãããå°ãªããšãä»ã®ãšãããECMAScriptã¢ãžã¥ãŒã«ããã®require
ã¯äœ¿çšã§ããŸãããcommonjsã¢ãžã¥ãŒã«ããã®import
ã¯äœ¿çšã§ããªãããã§ãã
ããã¯node--experimental-modules node_modules / mocha / bin / _mochaã®ããã«å®è¡ããããšæ³å®ã§ããŸããïŒ
.jsxã¯ã©ã®çšåºŠæ£ç¢ºã«é¢ä¿ããŠããŸããïŒ ç€ºãããŠãããšã©ãŒã®äŸã¯.mjsãåç §ããŠããããšãããããŸãã äœãæçš¿ãããŠããã®ããjsxãã©ãã«ããã®ãã¯äžæã§ãã
ã¯ãã --experimental-modules
ã§å®è¡ãããŸããã jsx
ã¯ã¿ã€ããã¹ã§ããã€ãŸãã mjs
ã¯ãæåã®æçš¿ãæŽæ°ããŸãã
ãŸãã.mjsãã¡ã€ã«æ¡åŒµåãå¿ èŠãšããNodeã®æåã®å®è£ ã«ã€ããŠèããããšãæŒ ç¶ãšæãåºããŸãã ãããïŒãŸã ïŒïŒçå®ã§ããã.jsxãã¡ã€ã«ã§ã€ã³ããŒã/ãšã¯ã¹ããŒãã䜿çšããããšããŠããå ŽåïŒ.mjsãã¡ã€ã«ã«.jsxãã¡ã€ã«ãã€ã³ããŒãããããã€ã³ããŒã/ãšã¯ã¹ããŒããå«ã.jsxãã¡ã€ã«ãããŒãããïŒãã¢ã«ã§ã¯ãªãåé¡ã«ãªããŸããïŒ
åé¡ã¯ãã¢ã«ãrequire
ã䜿çšããŠãã¹ããããŒãããããšã§ããããã«æãããŸãïŒç§ã¯ã¢ã«ã®å°é家ã§ã¯ãªããããå€ãã®ãŠãŒã¶ãŒã§ãããããå°ãªããšãç§ã®çŸåšã®ä»®å®ã§ãïŒã import
ãä»ããŠä»ã®ã¢ãžã¥ãŒã«ãå«ãŸããŸãã ããã¯æåã®ãã€ã³ããšäœµããŠãšã©ãŒã説æããŸãã
å®éšçãªæ©èœãžã®å€æŽããsemver majorãåŸ ããªããã°ãªããªãMochaãžã®å€æŽãå¿ èŠãšããªãããã«ããæ¹æ³ãèãåºãå¿ èŠããããŸããããããªããšãããã«é·ãåŸ ã€ããšãé€ããŠãçŸåšã®å Žæã«æ»ã£ãŠããŸãå¯èœæ§ããããŸãã ïŒã¢ã«ã®ã¡ãžã£ãŒãªãªãŒã¹ãµã€ã¯ã«ã¯ãããŒãã®ããã«å¹Žã«2åã«ããã¯ãããŠããªãããïŒã
ããŒã ã代衚ããã®ã§ã¯ãªããçŽç²ã«ç§èªèº«ã®æèŠããèšãã°ãæ°ããã¢ãžã¥ãŒã«åœ¢åŒãå€ã圢åŒã§èšè¿°ãããæ¢åã®ã©ã€ãã©ãªãå€æŽããã«å€ãã¢ãžã¥ãŒã«åœ¢åŒãšçžäºéçšã§ããªãå Žåãæ°ããã¢ãžã¥ãŒã«åœ¢åŒã¯ãŸã æºåãã§ããŠããŸããã
ãããçãã«ãªãã®ã§ã¯ãªãããšå¿é
ããŸãããããããæåªå
äºé
ã§ã¯ãªãããšãç解ããŠããŸãã äžèšã®ãšã©ãŒã®åå ã®ç§ã®ä»®å®ãæ£ãããã°ããã¹ãã®ãšã³ããªãã€ã³ãã¯commonjsã§ã¯ãªãmjs
ã¢ãžã¥ãŒã«ã§ããå¯èœæ§ããããããïŒ956ã®ãããªãã®ã圹ç«ã€å¯èœæ§ããããŸãã çŸåšã®ã¢ãžã¥ãŒã«ããimport
ããµããŒãããããšã¯ãnodejsããŒã ã®ããŒããããã«ããããã§ãããã¿ã€ã ã©ã€ã³ã«ã€ããŠã¯æ確ã§ã¯ãããŸããã
ç§ã®ïŒå°ãã®ïŒèª¿æ»ãããå°ãªããšãä»ã®ãšãããECMAScriptã¢ãžã¥ãŒã«ããrequireã䜿çšããããšã¯èš±å¯ãããŠããŸãããcommonjsã¢ãžã¥ãŒã«ããã€ã³ããŒãããããšã¯èš±å¯ãããŠããªãããã§ãã
çŸåšã®ã¢ãžã¥ãŒã«ããã®ã€ã³ããŒãããµããŒãããããšã¯nodejsããŒã ã®ããŒããããã«ããããã§ãããã¿ã€ã ã©ã€ã³ã«ã€ããŠã¯æ確ã§ã¯ãããŸããã
æ確ã«ããããã«ïŒãå€ããïŒå Žåã«ãã£ãŠã¯çŸåšã®éå®éšçãªïŒç°å¢ã§ã¯ã import
ã¯æ§æãšã©ãŒã§ãããåå²ããžãã¯ãªã©ã§ã¯åé¿ã§ããªããããMochaãå¿
èŠãšããã®ã¯ããã§ã¯ãããŸããimport
èªäœã䜿çšã§ããããã«ããããã§ã¯ãªãã require
ã䜿çšããŠãæ°ãã圢åŒã䜿çšããïŒãŸãã¯äœ¿çšããã¢ãžã¥ãŒã«ã䜿çšããïŒã¢ãžã¥ãŒã«ãããŒãã§ããããã«ããããã
jsxã¯ã¿ã€ããã¹ã§ããã€ãŸããmjsã¯ãæåã®æçš¿ãæŽæ°ããŸãã
ãããã§ãããã¯1ã€ã®å¯èœãªè§åºŠãæé€ããŸãïŒ
äžèšã®ãšã©ãŒã®åå ã®ç§ã®ä»®å®ãæ£ãããã°ããã¹ãã®ãšã³ããªãã€ã³ãã¯commonjsã§ã¯ãªãmjsã¢ãžã¥ãŒã«ã§ããå¯èœæ§ããããããïŒ956ã®ãããªãã®ã圹ç«ã€å¯èœæ§ããããŸãã
æ®å¿µãªãããã¢ã«ãã°ããŒãã«å€æ°ãäœæããªãããã«ããããšã¯ãããé£è§£ãªå éšæ§é ã®ããã€ããå€§å¹ ã«æžãçŽãããšãªãã«ã¯äžå¯èœã§ãïŒç§ã¯ãããèªåã§ç解ããããšããŸããããç解ã§ããŸããã§ããð¿ïŒ; ãã ããç¬èªã®JSãšã³ããªãã€ã³ãã䜿çšã§ããããã«ãªã£ãã®ã¯ããããã°ã©ããã£ãã¯ãAPIïŒå€ãwikiããŒãžãšãœãŒã¹ãã¡ã€ã«ã®JSDocã³ã¡ã³ã以å€ã§ã¯ææžåãããŠããªãå¯èœæ§ããããŸãããå ¬åŒã«ã¯ãµããŒããããŠããŸãïŒã§ãã
// test.mjs
var Mocha = require('mocha'),
var mocha = new Mocha();
// your mission: create a file `example.mjs`
// in the `test` folder and have it `import` stuff
// as well as using `describe` and `it` to make tests
mocha.addFile("./test/example.mjs");
mocha.run(function(failures){
process.on('exit', function () {
process.exit(failures ? 1 : 0);
});
});
node --experimental-modules test.mjs
ç§ã¯å®éã«ãããéããçããã©ããã確èªããããã«ãããè©ŠããŠããŸããïŒæåã«ããŒãã®ææ°ããŒãžã§ã³ãååŸããå¿ èŠããããŸãïŒãããããããªãã®ããã«åããã©ããç§ã«ç¥ãããŠãã ãã...
ãŸãã¯ãæ¯æŽããããšãããããŸãïŒ
ç§ã¯ãããè©ŠããŸãã
// runner.mjs
import Mocha from 'mocha';
var mocha = new Mocha();
// your mission: create a file `example.mjs`
// in the `test` folder and have it `import` stuff
// as well as using `describe` and `it` to make tests
mocha.addFile('./test/frontend/components/global/test.mjs');
mocha.run(function (failures) {
process.on('exit', function () {
process.exit(failures ? 1 : 0);
});
});
ãããã£ãŠãåºæ¬çã«ããŒããšã³ããªãã€ã³ããECMAScriptã¢ãžã¥ãŒã«ã«ããŸããã
node --experimental-modules --harmony ./runner.mjs
çµç±ã§å®è¡ããŸã
ç§ã¯åŸã
(node:88620) ExperimentalWarning: The ESM module loader is experimental.
{ Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /.../test/frontend/components/global/test.mjs
at Object.Module._extensions..mjs (module.js:658:11)
at Module.load (module.js:545:32)
at tryModuleLoad (module.js:508:12)
at Function.Module._load (module.js:500:3)
Mochaãå¿ èŠãšããŠããã®ã¯ã
import
èªäœã䜿çšã§ããããã«ããããšã§ã¯ãªããæ°ãã圢åŒã䜿çšããïŒãŸãã¯äœ¿çšããã¢ãžã¥ãŒã«ã䜿çšããïŒã¢ãžã¥ãŒã«ãããŒãããããã«requireã䜿çšã§ããããã«ããããšã§ãã
çŸåšãããŒãã§ã¯äœ¿çšã§ããŸããã import
ãä»ããŠã€ã³ããŒãããã¢ãžã¥ãŒã«ã§ã®ã¿require
ã䜿çšã§ããŸãã mocha.addFile('./test/frontend/components/global/test.mjs');
ãåé¿ãã代ããã«ãã¹ããã€ã³ããŒãããŠãã€ã³ããŒãããã¹ã¯ãªããã次ã®ããã«è¿œå ããæ¹æ³ã¯ãããŸããïŒ
import test from './test';
mocha.addTest(test);
ïŒ
çŸæç¹ã§ã¯ã¢ã«ã«ã¯ãã®ãããªæ©èœã¯ãããŸãããããããã«æ²¿ã£ãŠäœããè¡ãããšãã§ããŸãã addFile
ã¯ããã¡ã€ã«ããªã¹ãã«è¿œå ããã ãã§ãåŸã§$ run
é¢æ°ã«ãã£ãŠrequire
dã«ãªããŸãã run
é¢æ°ã¯ã loadFiles
ãrequire
ã«åŒã³åºããŸãã
https://github.com/mochajs/mocha/blob/1cc0fc0e6153bbd746b0c2da565363570432cdf7/lib/mocha.js#L220 -L235
ããªãããããã®ã¯ã require
import
ãç·šéããå¿
èŠããããã¡ã€ã«ã®å Žåã§ããdã¯addFile
ãåŒã³åºããªãã§ãã ããïŒãããã£ãŠãMochaã¯require
ãè©Šã¿ãŸããã run
ïŒã代ããã«run
ãåŒã³åºãåã«ã loadFiles
ã«ãããããªã³ãŒããåŒã³åºããŸããã require
import
ã䜿çšããŸãrequire
ã import
ã®äœ¿çšã«ããã劚ããå¶éããããã©ããã¯é ã®äžã§æãåºããŸããããå¯èœã§ããã°ã次ã®ããã«èŠãããšæããŸãã
modules.forEach(function (file) {
file = path.resolve(file);
mocha.suite.emit('pre-require', global, file, mocha);
import fileExport from file; // fileExport is used by the exports interface, not sure if anything else; most interfaces act as a side effect of running the file
mocha.suite.emit('require', fileExport, file, mocha);
mocha.suite.emit('post-require', global, file, mocha);
});
ãŸãã httpsïŒ//github.com/mochajs/mocha/blob/master/bin/_mochaãMochaã®ããã°ã©ã APIã䜿çšããŠãä»ã®ãªãã·ã§ã³ãæäŸããæ¹æ³ããMochaã®ãã¡ã€ã«ã«ãã¯ã¢ããæ©èœãªã©ã䜿çšããæ¹æ³ãç解ããæ¹æ³ã確èªã§ããŸãã ããŸãããæŽçãããŠããŸããããã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ã€ã¹ãè¡ãããšã¯ãã¹ãŠããã«ãããŸãïŒçŽæ¥ãŸãã¯Mochaã®ããã°ã©ã APIã®é¢æ°ãžã®åŒã³åºããããããïŒã
ããã«äžæ©é²ãããšãã§ããŸãããã€ã³ããŒãããããã¹ãã¯ãdescribeïŒ ReferenceError: describe is not defined
ïŒã«ã€ããŠç¥ããªããšæå¥ãèšããŸãã ããã泚å
¥ããé©åãªæ¹æ³ã¯äœã§ããïŒ ç§ãè¡ã£ãå Žå
import Mocha from 'mocha';
const describe = Mocha.describe;
TypeError: describe is not a function
ãšæå¥ãèšã
ããã§ãç§ã®ãã£ã¹ããªãã¥ãŒã·ã§ã³ã¯ã€ãã«NodeJS 8.5ãæã«å ¥ããŸããããããŠç§ã¯ããã§éãã§ãç§ãæã£ãŠããããã€ãã®ãã³ãã確èªããæ©äŒããããŸããããç§ããã§ãã¯ã§ããããã«ãªããŸã§è¿°ã¹ãããããŸããã§ããïŒ
require
ãä»ããŠããŒãã§ããããã«å€æŽãããå Žåãããããäœãå€æŽããå¿
èŠã¯ãããŸããããã¢ãžã¥ãŒã«ãã©ã®ããã«æ©èœãããã«ã€ããŠã¯ããããçºçãããŸã§ç¢ºå®ã«èšãããšã¯ã§ããªããšæããŸãã ãïŒpre-require
ã€ãã³ããšããã·ã§ã³ã§ã€ã³ã¿ãŒãã§ãŒã¹ãã»ããã¢ããããŸããïŒã¢ãžã¥ãŒã«ãæåã«ããŒãããããšãã§ã¯ãªããéžæãããã€ã³ã¿ãŒãã§ãŒã¹ã¯new Mocha
ã€ã³ã¹ã¿ã³ã¹ã«åºæã§ãïŒãæ°ããã¢ãžã¥ãŒã«ã·ã¹ãã ã¯å®éã«äŸåé¢ä¿ããªãŒã解æããŸãäŸåé¢ä¿ãäŸåããã¢ãžã¥ãŒã«ã®åã«ããŒãããããã describe
ãå®çŸ©ãããŠããªãçç±ã¯ããã¹ãã¢ãžã¥ãŒã«ãããŒãããããŸã§MochaãäŸåé¢ä¿ãèšå®ããªãããã§ãã ã€ãŸãããããå®çŸããã«ã¯è€éã«ãªããŸãïŒãã ãã require(file)
ãèš±å¯ããããã®ç¹å®ã®è¡ã§äŸåé¢ä¿ãèªã¿èŸŒãŸãããŸã§ãã§ããã°åæããŠãä»ã«äœãå€æŽããå¿
èŠããªãå Žåãé€ããŸãïŒã ïŒããããã import
edã¢ãžã¥ãŒã«ãimport
åŒã³åºãã®é åºã§ããŒãããããšããäºå®ãå©çšããããšã§ããããæ©èœãããããšãã§ããããšãçºèŠããŸããã ïŒãªã³ã¯ããããšããŠããã³ãŒãã§èª¬æãããŠããããã«ãExportsã€ã³ã¿ãŒãã§ã€ã¹ãŸãã¯åã
ã®ãã¡ã€ã«ã®ååãå¿
èŠãšããã¬ããŒã¿ãŒã䜿çšãããšãã¯ããã«åé·ã«ãªããŸãããååãšããŠæ©èœããŸããïŒäžèšã®ä»ã®äºå®ãå€æŽããã«å€æŽããã«ã¯ãããã§ãããŸã£ããäžå¯èœã§ãã ãããä»ã®ãšãããããã¯ããªããããªããã°ãªããªãããšã ãšæããŸãã
https://gist.github.com/anonymous/caba0883254a2349c5615df8e9286665
node --experimental-modules ./run.mjs
æ®å¿µãªãããESã¢ãžã¥ãŒã«ã®åäœæ¹æ³ãšãçŸæç¹ã§Nodeãèš±å¯ããŠããããšãèãããšããããæåã®æ¹æ³ã§ãããšç¢ºä¿¡ããŠããŸãã
å¥ã®æ¹æ³ã§èããŠãã ããã
import
ã¯æ§æã§ããrequire
ã¯é¢æ°ã§ããããšãã°ã eval()
ã䜿çšããã«ã³ãŒããåçã«å®è¡ã§ããªãã®ãšåæ§ã«ãåçã«import
ãå®è¡ããããšã¯ã§ããŸããã
ãã®åäœãå¯èœã«ãããã®ã¹ããŒãž3ã®ææ¡ããããŸãããã©ã³ã¿ã€ã ããŸã ãããåºè·ããŠãããã©ããã¯ããããŸããã
ãã®ããã mocha
ãä»ããŠå®è¡ããå ŽåãMochaã.mjs
ãã¡ã€ã«ãã€ã³ããŒãããã«ã¯ããããã@ std / esmãè¿œå ãã .mjs
ãå«ããã¡ã€ã«ã«require
å®è£
ã䜿çšããå¿
èŠããããŸãã .mjs
æ¡åŒµåã ããã¯å®è¡å¯èœãªè§£æ±ºçã§ãããç§ãã¡ããµããŒãããããšãæ€èšã§ãããã®ãããããŸããããå°ãªããšããã®è¡åãæã®åŸãã«ãªãéããè°è«ïŒããã³ãã®ãããªPRïŒã¯ã³ãã¥ããã£ããæ¥ãå¿
èŠãããã§ãããã
import describe from 'mocha'
ã¯ãæ®å¿µãªããããã®çš®ã®ãã®ã«åºæã®é£ããã®ããã«ãåªå
é äœãªã¹ãã§ããªãäœããªã£ãŠããŸãïŒïŒ956ïŒã node
ã§å®è¡ããã°ããŒãã«ã®æ¶è²»ã«åºå·ããã®ãæåã§ãã
å®éããã®ãããªãã®ãã¢ãžã¥ãŒã«ããµããŒãããŠãããšä»®å®ãããšããã¹ããããŒãããŠvm.runInContext
ã掻çšã§ãããšæããŸãã ããŒãã®èªã¿èŸŒã¿åäœã¯.mjs
æ¡åŒµåã«é¢é£ä»ããããŠããã vm.runInContext
ã¯æååãæ³å®ããŠãããããã©ã®ããã«ã§ãããã¯ããããŸãããããã¥ã¡ã³ãã«ã¯ããã«ã€ããŠäœãèšèŒãããŠããŸããã å€åã©ããã®åé¡ïŒ
ïŒç¹°ãè¿ãã«ãªããŸãããããã¯@std/esm
ãå
éšã§è¡ãããšãšãŸã£ããåããããããŸããïŒïŒ
ãã©ãŠã¶ã§ãã©ã³ã¹ãã€ã©ãŒãªãã§åäœããã¢ã«ãã¹ãããããŸãã å€åããã¯ãã®åé¡ã«åœ¹ç«ã¡ãŸãã
ã¢ã«ãã¢ãžã¥ãŒã«ãšããŠã§ã¯ãªããã¹ã¯ãªãããšããŠåã蟌ãã®ã§ãããã¯é¢ä¿ãããŸãã...
ãã¿ãŸãããæ··ä¹±ããŸããã ãã©ãŠã¶ã§ã¯éããŸãã
MochaãESã¢ãžã¥ãŒã«ã«ãããã¹ããå®è¡ã§ããããã«ããããã®ãµããŒãã®æ祚ã«åå ããããšæããŸãã ãã®ãããªãã¹ããæžã蟌ãããšããŠãNode.jsã¢ãžã¥ãŒã«ããŒããŒããå¥åŠãªãšã©ãŒãçºçããåŸãç§ã¯ããã«çéžããŸããã ES6ã¢ãžã¥ãŒã«ããã€ãã£ãã«ãµããŒãããNode.js9.5ã䜿çšããŠããŸãã
çŸåšã®ãšãããNode.js 9.5ã§ã¯ãCommonJSã¢ãžã¥ãŒã«ãES6ã¢ãžã¥ãŒã«ãrequireïŒïŒããããšã¯ã§ããŸããã å€å圌ãã¯ãããèš±ãæ¹åã«åããŠããã®ãããããŸãããç§ã«ã¯ããããŸããã
.mjs
æ¡åŒµåã®ä»ããES6ã¢ãžã¥ãŒã«ãšããŠãã¹ããäœæããå®è¡ããããšããŸããã ããŒããŒãããšã©ãŒãçºçããŸãã- mocha
ã³ãã³ãã§require()
ã䜿çšããããšæããŸãããããã倱æããçç±ã§ãã
.js
æ¡åŒµåã䜿çšããŠãã¹ããããçŽãã require()
ã䜿çšããŠãã¹ã察象ã®ã¢ãžã¥ãŒã«ãããŒãããããšããŸããã ããŒããŒããããšã©ãŒãçºçããŸããã
Node.jsã®äžçã§ã¯ãES6ã¢ãžã¥ãŒã«ãžã®ç§»è¡æ¹æ³ãšãµããŒãæ¹æ³ãæ€èšããå¿ èŠããããšæããŸãã ã¢ã«ã¯ãã®äžçã§éåžžã«äººæ°ã®ããããŒã«ã§ãããããã¢ã«ããŒã ãES6ã¢ãžã¥ãŒã«ããµããŒãããæ¹æ³ãæ€èšããã®ãæåã§ãã
ãã©ããŒã¢ããããã«ã¯...çèããŠæ€çŽ¢ããåŸããã®ã·ãŒã±ã³ã¹ãåé¿çãšããŠæ©èœãããããšãã§ããŸããã
ãã¹ãã¹ã¯ãªããã«.js
æ¡åŒµåãä»ããŠååãä»ããŸãïŒCommonJSã¹ã¯ãªããã«ããŸãïŒ
次ã«ãããããã¹ãã¹ã¯ãªããã«è¿œå ããŸãã
require = require("@std/esm")(module,{"esm":"js"});
次ã«ãESã¢ãžã¥ãŒã«ã次ã®ããã«require()
ã§ããŸãã
const model = require('../models/notes');
@robogeekãŸãã¯ãã³ãã³ãã©ã€ã³ãã@std/esm
ããªããŒããŒã䜿çšããæ¹ãããå Žåããããããåé¿çã§ã¹ããã¯ãã¡ã€ã«ãä¹±éã«ããå¿
èŠã¯ãªãã .mjs
ã®æ¡åŒµåãä»ããããšãã§ããŸãã
mocha -r @std/esm spec.mjs
åçã€ã³ããŒãã¯ã --harmony-dynamic-import
ãã©ã°ã®åŸãã«ããŒãv9.6ãä»å±ããŠããŸãã åçã€ã³ããŒãã«ãããmochaã¯ãã©ã³ã¹ãã€ã©ãŒãå¿
èŠãšããã«es6ã¢ãžã¥ãŒã«ã«å«ãŸãããã¹ããããŒãã§ããŸãã
@harrysarsonç®±ããåºããŠåäœããããšã¯ãããŸããã Mochaã¯cjsã¢ãžã¥ãŒã«ãšrequire
ã䜿çšããŸãã import
ã®éåææ§ãåŠçããããã«ãããã€ãã®è¿œå ã®ã°ã«ãŒã³ãŒãã䜿çšããŠãcjsã䜿çšããŠãã¹ããã¡ã€ã«ãäœæããå¿
èŠããããŸãã ãããšãç§ã¯äœãã足ããªãã®ã§ããïŒ
ç§ã¯ãåé¡ããªããã©ãããç£èŠãããããã§ãã
ãã®åé¡ã«ã¯æè¿ã®ã¢ã¯ãã£ããã£ã¯ãããŸããã stale
ãšããã©ãã«ãä»ããŠããŸãã 14æ¥ä»¥å
ã«ããã以äžã®ã³ã¡ã³ããã¢ã¯ãã£ããã£ããªãå Žåã¯ããã®åé¡ãã¯ããŒãºããŸãã
ã¢ã«ã«è²¢ç®ããŠãããŠããããšãïŒ
ãã®åé¡ã¯äŸç¶ãšããŠé¢é£ããŠããŸãããESMã®ãã€ãã£ããµããŒãã«äŸåããŠããŸãã ãã©ãŠã¶ã«ã¯ããããããŸãããããŒãã¯ãŸã ãããŸããã
ç§ã¯ãã éãã§ããŠãESM / .mjsã«æ
£ããŠããŠãããã¡ãã®ãã¹ããå¿
èŠã ãšå€æããŸããã ã¢ã«ããŸã å
¬åŒã«.mjs
ãã¡ã€ã«ããµããŒãããŠããªãããšã«æ°ä»ããã®ã§ãç§ã¯ç°¡åãªæ«å®ã¢ãžã¥ãŒã«ãäžç·ã«ãããŸããïŒèª°ããã¢ã«ã«å®å
šãªãµããŒããè¿œå ããæéããããŸã§ïŒïŒ
https://www.npmjs.com/package/mocha-esm
PR /åé¡ãæè¿ããŸãïŒ https ïŒ//github.com/stefanpenner/mocha-esm
ããã«ã¯ãã£ãšè¯ããã®ããããããããŸããããäžç·ã«ããéããã®ã¯æ¥œããã£ãã§ãã ã ãã\ o /
åçã€ã³ããŒãããµããŒãããããã«mocha
èªäœããã©ãŒã¯ããããšã«ããŸããïŒäžèšã®ããã€ãã®ã¢ã€ãã¢ã«åºã¥ããŠããŸãããä»ã®æ¹æ³ã§å®è¡ããããšã¯ã§ããŸããã§ããïŒã
ããã¯ãããšãã°node --experimental-modules --harmony-dynamic-import test.mjs
ã䜿çšããŠå®è¡ã§ããããšãæå³ããŸã
次ã«ã test.mjs
ïŒ
import 'should';
import Mocha from 'mocha';
const mocha = new Mocha();
mocha.addFile(() => import("./some-module.spec.mjs"));
mocha.run(failures => {
process.on('exit', function () {
process.exit(failures ? 1 : 0);
});
});
ãã®æå°éããµããŒãããããã«mochaã®å€æŽãç¶æããæœåšçãªPRã®ããã«ãããé©åã«çµ±åããæéããªããå°çšã®npmã¢ãžã¥ãŒã«ãè¿œå ããŸããã§ãããããã®ãã©ãŒã¯ãgithubããçŽæ¥ã€ã³ã¹ããŒã«ã§ããŸã"mocha": "git+https://[email protected]/odolha/mocha"
ã
mochaã¯PromiseãæäŸããé¢æ°ãæåŸ ããŠããããããã®ã¢ãããŒãã䜿çšããŠãåçã€ã³ããŒãã ãã§ãªããä»»æã®éåææ¹æ³ã§ãã¡ã€ã«ãããŒãã§ããããšã«æ³šæããŠãã ããã
ç·šé
ã³ã³ããã¹ããæ³šå ¥ã§ããªãããããã®ã¢ãããŒãã§ã¯ãã¹ããçŽç²ãªã¹ã¯ãªããã«ããããšã¯ã§ããªãããšãå¿ããŸããããã®ä»£ããã«ã次ã®ããšãè¡ãå¿ èŠããããŸãã
// some-module.psec.mjs
export const test = ({ describe, it }) => {
describe('Something', () => {
it('works', () => {
...
}
@odolha
ãã©ãŒã¯ããªã³ã¯ããŠããã ãããããšãããããŸãã
ãã€ãã£ãESMããµããŒãããPRã¯ãã§ã«ãããŸããããã¢ãžã¥ãŒã«ã®ãµããŒãã¯ãŸã å®éšæ®µéã§ãããããééãããŸããã
ããªãã®å®è£ ã¯ãããã«å¯ŸãããµããŒããè¿œå ããã®ã¯ç°¡åãªã¯ãã ãšç§ãæ °ããŸãã ãã®æ©èœãåŸ ã¡æãã§ãã人ã¯ããããããŸã:)
@demurgos ïŒno_mouthïŒãã...ç§ã¯èªåã®ããšãããåŸããã®PRãèŠãã ãã§ããd'ohðã
@harrysarson @boneskull
esm
ããã±ãŒãžïŒä»¥åã®åå@std/esm
ïŒã¯ããã®ã³ãããã§ãµããŒã.mjs
ãã¡ã€ã«ãåé€ããŸããã
ããã¯ãMochaã§.mjs
ãã¡ã€ã«ããã¹ãããããã«ããã䜿çšããããšãã§ããªããªã£ãããšãæå³ããŸãã ããã«ã€ããŠã¯ããã®å·ã§èª¬æããŸãã
ESã¢ãžã¥ãŒã«ããã¹ãããŠãããŒããŸãã¯ãã©ãŠã¶ãŒã§å®å šã«å®è¡ã§ããããã«ãããã®ã§ããã
çŸåšã®ã¢ãžã¥ãŒã«ã®è°è«ã«é¢ããŠã¯ã .mjs
ãæçµçµæã§å©çšå¯èœã§ããå¿
èŠãããïŒããããå¯äžã®è§£æ±ºçã§ã¯ãªãããå°ãªããšãå©çšå¯èœã§ããïŒã import("./foo.mjs")
ã¯å¯Ÿå¿ããESåå空éã CJSã¢ãžã¥ãŒã«ãmodule.exports
default
ãšã¯ã¹ããŒããæã€ã¢ãžã¥ãŒã«ã«å€æããããšããäºå®ã¯ãã£ãšè°è«ãããŠããŸãããããã¯å®å
šãªä»®å®ã®ããã§ãã
åçimport
ã䜿çšããŠãã€ãã£ãESãµããŒããã¢ã«ã«è¿œå ããããšãåæ€èšããããšã¯å¯èœã§ããããïŒ æ©èœãã©ã°ã®ååã--experimental-es-modules
ïŒïŒ3253ããïŒã«å€æŽããŠããããããŒãã®ãµããŒãã®çŸåšã®é²æ©ã«äŸåããŠããããšãããé©åã«ç€ºãããšãã§ããŸãã
ç· ãåãã«ãããšãæçµä»æ§ã¯ããŒã12ãŸã§å°éããªããããçŸåšã®å®è£
ã¯ãã°ããã®éããã«æ®ããŸãïŒãããŠãæçµææ¡ã®æ¯èŒçå®å
šãªãµãã»ããã§ãïŒã
@demurgosç§ã¯å人çã«ãã¢ã«ã®ã³ãŒãå®è£ ã«ã³ãããããåã«ããããããå°ãåŸ ã€ããšã奜ã¿ãŸãã ãããããããã@boneskullãŸãã¯@ScottFreeCodeã¯åæããŸãããïŒ
@demurgos
esmããã±ãŒãžïŒä»¥åã®ååã¯@ std / esmïŒã¯ããã®ã³ãããã§ãµããŒã.mjsãã¡ã€ã«ãåé€ããŸããã
esm
ããŒããŒã¯.mjs
ã®ãµããŒããçµäºããŸããã§ããã çŸåšã®--experimental-modules
ã®å®è£
ã«åŸãã require
$ã䜿çšããŠ$ .mjs
ãèªã¿èŸŒãããšãããšããšã©ãŒãã¹ããŒãããŸãã ãŠãŒã¶ãŒã¯ãESMæ§æãŸãã¯åçimport()
ã䜿çšãããã¹ããšã³ããªãã¡ã€ã«ã«.js
ãã¡ã€ã«ã䜿çšããŠã .mjs
ãŸãã¯.js
ã®åŸç¶ã®ãã¹ããã¡ã€ã«ãããŒãã§ããŸãã esm
ãç¬èªã®ãã¹ãã«å¯ŸããŠè¡ãããã«ã
ç· ãåãã«ãããšãæçµçãªä»æ§ã¯ããŒã12ãŸã§å°éããªããããçŸåšã®å®è£ ã¯ãã°ããã®éããã«æ®ããŸã
--experimental-modules
ããã©ã°ãªãã§çéžããããã®æ±ºãŸã£ãæéã¯ãããŸããã åžæã¯ãããŒã10ã®ãµããŒããµã€ã¯ã«ã®ãã€ãïŒã€ãŸããä»åŸ2幎éã®ãã€ãïŒ_ã«çéžã§ããããšã§ãããäœã決ãŸã£ãŠããªãã®ã§ãã
ïŒãããŠãæçµææ¡ã®æ¯èŒçå®å šãªãµãã»ããã§ãïŒã
çŸåšã®--experimental-modules
ã®å®è£
ã¯ãæçµçãªææ¡ãšäºææ§ããªãå¯èœæ§ããããŸãã Nodeã§ã®ESMãµããŒããã©ã®ããã«ãªããã«ã€ããŠã¯ããã€ãã®è°è«ããããŸãã ããã€ãã®ææ¡ãããæ¹åæ§ã¯ãçŸåšã®å®éšçå®è£
ãšäºææ§ããããŸããã ä»æ¥æžããã³ãŒãã--experimental-modules
ã§ã©ã®ããã«æ¯ãèããã«ãã£ãŠã¯ãæçµçãªåœ¢åŒãäœã§ãããæ©èœããªãå ŽåããããŸãã
esmããŒããŒã¯.mjsã®ãµããŒããçµäºããŸããã§ããã
ç§ã®ãã€ã³ãã¯ã esm
ã§ã¯.mjs
ãèŠæ±ã§ããªããªã£ãããã .mjs
ã§Mochaã®ãã¹ãæ€åºã䜿çšã§ããªããªã£ãããšã§ãã ããããããªãã¯æ£ããã§ããããã¯ææžåãããŠããªãã£ãã®ã§ãä»ã®äººã
ãããã«äŸåãããšããŠããããã¯å®éã«ã¯é倧ãªå€æŽã§ã¯ãããŸããã
ç· ãåãã«ã€ããŠã¯ããã®å·ãåèã«ããŸããã ããŒã11ãšããŒã12ã®æçµçãªå®è£ ãè©Šã¿ãããŠããããã§ãããŒã10LTSã«ç§»æ€ã§ããŸãã ããããã£ãšæ©ãèµ·ããããšãæã人ãããã°ãæ¥ããªãããã«èŠåãã人ãããŸãã
ç§ã®ææ¡ã¯ïŒ3253ãããŒãžããããšã§ãã ããã¯ããã¹ãã±ãŒã¹ãããŒãããããã«require
import(...)
ã䜿çšãããªããã€ã³ã¡ã«ããºã ã®ã¿ãæäŸããŸãã --experimental-modules
ã®ã³ã³ããã¹ãã§ã¯ãã»ãšãã©ã®å Žå.mjs
ã«é©çšããããšæããŸãã®ã§ãããã§ãå®å
šã ãšæããŸãã ïŒåå空épromiseãè¿ã.mjs
ã®åçã€ã³ããŒãã¯æ®ãå¯èœæ§ããããŸãïŒã ããããç§ã¯ããªãããããããŒãžããŠããããé床ã«ããã·ã¥ããããšãé¿ããããšãã§ãããã©ãããããªãã«æ±ºããããŸãã
ç¹°ãè¿ãã«ãªããŸããããã®PRã®äž»ãªçç±ã¯ããã®PRããªããšãMochaã®ãã¹ãæ€åºã䜿çšã§ããªããªããŸããã@ jdaltonã«ãã£ãŠäžèšã§èª¬æãããåé¿çã䜿çšããå¿
èŠãããããã§ãã ïŒ .js
ãšã³ããªãã€ã³ããšæåã€ã³ããŒãïŒ
ç§ã®ææ¡ã¯ïŒ3253ãããŒãžããããšã§ãã
@jdaltonã®äŸã«åŸã£ãŠã esm
ããã±ãŒãžïŒçŽç²ãªNode + MochaïŒãªãã§ãã€ãã£ãESMããã¹ãããããã®å°ããªã¯ãŒã¯ãããŒãèšå®ããŸããã
éåæãã¹ãå®çŸ©ïŒ --delay
ã䜿çšïŒãš--experimental-modules
ã䜿çšããŸãã
çŸåšã_mocha_ã¯CJSã®ã¿ãã€ã³ããŒãã§ããCJSã¯åçimport()
ç䌌é¢æ°ã䜿çšããŠã®ã¿ESMãã€ã³ããŒãã§ããŸãã ããã§ã次ã®CJSãšã³ããªãã€ã³ãïŒååã¯.js
ã§çµããïŒãçæããŸããããã«ãããä»æ§ãã¡ã€ã«ãã€ã³ããŒãããããã¹ãã®å®è¡ãããªã¬ãŒãããŸãã
test.esm.js ïŒ
(async () => {
await import("./test/a.spec.mjs");
await import("./test/b.spec.mjs");
run();
})();
ïŒãã«ãæã«ã€ã³ããŒãã®ãªã¹ãã䜿çšããŠãšã³ããªãã€ã³ããçæããŸãããæåã§äœæããããããã§glob
ã䜿çšã§ããŸããïŒ
次ã«ã次ã®ã³ãã³ãã§å®è¡ããŸãã
NODE_OPTIONS="--experimental-modules" mocha --delay build/test/test.esm.js
ãã©ã°ãmochaã«ãã£ãŠèªèãããªãããã NODE_OPTIONS
ãééããå¿
èŠããããŸãã
ã¢ã«ãå®éšçãªESMãããè¯ããµããŒãããŠãããããšãé¡ã£ãŠããŸãããå°ãªããšããä»ã®ããŒã«ãªãã§ä»æ¥ããã䜿çšããæ¹æ³ãããããšãç¥ã£ãŠããã®ã¯ããããšã§ãã
@demurgosããã¯ããªããèŠã€ããã¡ãã£ãšããåé¿çã§ãïŒ+1:ã
mochaïŒ smileïŒã§esã¢ãžã¥ãŒã«ã䜿çšããããšãå®éã«å¯èœã§ããïŒç°¡åã§ã¯ãªãã«ããŠãïŒããšã確èªããã®ã¯è¯ãããšã§ãã
@demurgosãã®åé¡ã¯ããã©ã³ã¹ãã€ã©ãŒã䜿çšããã«ES6ã¹ã¿ã€ã«ã®ãã¹ãããµããŒãããããšã«é¢ãããã®ã§ãã ããã«ãæéããšã¯äœã§ããïŒ ãã¹ããšã³ããªãã€ã³ããçæããããã«äœ¿çšããã³ãŒãã¯ãã©ã³ã¹ãã€ã©ãŒã§ãããç¹æ®ãªãã®ã§ãã
@rulatir
ãã«ãããŒã«ã䜿çšããŠãããšè¿°ã¹ãŸãããããããã¯ãã®å·ã§èª¬æããã¬ãã«ã§ã¯ãããŸãããMochaã¯ãã€ãã£ãESMã§å®è¡ãããŠããããã©ã³ã¹ãã€ã©ãŒã«ãã£ãŠESMãCJSã«äžããããããã§ã¯ãããŸããã
ç§ã®ã¡ãã»ãŒãžãåç §ããŠãã ããïŒ
ãã«ãæã«ã€ã³ããŒãã®ãªã¹ãã䜿çšããŠãšã³ããªãã€ã³ããçæããŸãããæåã§äœæããããããã§
glob
ã䜿çšã§ããŸãã
ã€ã³ããŒããïŒ1ïŒéçã«å®çŸ©ããïŒ2ïŒèªåã§ãªã¹ããç¶æããªãããã«ããããããã«ãã¹ãããã䜿çšããŸããã
ã¹ããã¯ãã¡ã€ã«ãæ°åãããªãå Žåã¯ãïŒ2ïŒãåé€ããŠãåé¡ãããŸããã1ã2åã®ã¹ããã¯ãã¡ã€ã«ãã€ã³ããŒããããšã³ããªãã€ã³ããçšæããã ãã§ãã
ïŒ1ïŒã¯ãã§ã«ãã¹ããã¡ã€ã«ã®ç¹å®ã®èŠä»¶ã§ãããããã»ãšãã©ã®å Žåãå¿
èŠãªãã®ãã§ãããå®è¡æã«glob
ã䜿çšã§ããŸãïŒç§ã®ãããªãã«ãæéã®ä»£ããã«ïŒã ããã¯ãæ žãšãªãã¢ã€ãã¢ãç解ããã°ãæçµçã«ã¯éèŠã§ã¯ãªã詳现ã«ãããŸããã
å®è¡æã«mjsã¹ããã¯ãã¡ã€ã«ãèŠã€ããåçŽãªã³ããŒã¢ã³ãããŒã¹ããœãªã¥ãŒã·ã§ã³ã®ãããªãã®ãå¿ èŠãªå Žåã¯ã次ã®äŸãåç §ããŠãã ããã
const {sync: globSync} = require("glob");
(async () => {
const matches = globSync("**/*.spec.mjs");
for (const match of matches) {
await import(match);
}
run();
})();
NODE_OPTIONS="--experimental-modules" mocha --delay test.esm.js
ã§å®è¡ããŸãã
ã芧ã®ãšããããã«ãã¯ãŸã£ãããããŸããããã³ãŒãã«ããå°ããã€ãºããããŸãã
ç§ã¯ãåé¡ããªããã©ãããç£èŠãããããã§ãã
ãã®åé¡ã«ã¯æè¿ã®ã¢ã¯ãã£ããã£ã¯ãããŸããã stale
ãšããã©ãã«ãä»ããŠããŸãã 14æ¥ä»¥å
ã«ããã以äžã®ã³ã¡ã³ããã¢ã¯ãã£ããã£ããªãå Žåã¯ããã®åé¡ãã¯ããŒãºããŸãã
ã¢ã«ã«è²¢ç®ããŠãããŠããããšãïŒ
ãã®åé¡ã¯åŒãç¶ãæå¹ã§ãããã¯ããŒãºããªãã§ãã ããã
ä»åŸã®mocha@6
ãªãªãŒã¹ã§ã¯ããã¯ã€ããªã¹ãã«ç»é²ããã--experimental-modules
ãã©ã°ãèšå®ãããES6ã¢ãžã¥ãŒã«ãããç°¡åã«è©Šãããšãã§ããŸãã v6ããåã«ãã€ããŒãªãªãŒã¹ãŸãã¯ããããªãªãŒã¹ãè¡ãããšã¯å¯èœã§ããïŒ ç§ã¯çŸåšãã€ã¹ã¿ã³ããŒã«ã®ä»£ããã«V8ãããã¬ãŒã䜿çšããæ°ããã«ãã¬ããžããŒã«ãå®æãããŠãããMochaããã³ES6ã¢ãžã¥ãŒã«ã§ãã¹ãããããšèããŠããŸãïŒpackage.jsonã§gitäŸåé¢ä¿ã䜿çšããå¿
èŠã¯ãããŸããïŒã
@demurgos
ãã®ããã«ããããšãããš...
const {sync: globSync} = require("glob");
(async () => {
const matches = globSync("**/*.spec.mjs");
for (const match of matches) {
await import(match);
}
run();
})();
ç§ã¯åŸã
(node:4632) UnhandledPromiseRejectionWarning: Error: Cannot find module test/Sanity.spec.mjs
ããããç§ããã®ããã«èµ°ããš...
const {sync: globSync} = require("glob");
(async () => {
await import("./Sanity.spec.mjs");
run();
})();
ããã¯ç§ãæ¬ ããŠãããã®ãå®ç§ã«å®è¡ããŸããïŒ
@ demurgos @ bcoeãšèª¿æŽããå¿ èŠããããŸãã https://github.com/bcoe/c8ãåç §ããŠãã ãã
@demurgosã§ãã€ããŒãªãªãŒã¹ãã«ããããã«ã¯ãv5.2.0以éã®ãã¹ãŠã®éãã¬ãŒã¯å€æŽããã©ã³ãã«ãã§ãªãŒããã¯ããŠãããããCHANGELOGã«ã³ã³ãã€ã«ããå¿ èŠããããŸãã ããªããŸãã¯ä»ã®èª°ãããã®ä»äºãåãã§è¡ãå Žåã¯ããªãªãŒã¹ãã«ããããããšãã§ããŸãã
fwiw Node.jsã®ã¹ããŒãªãŒããŸã£ããã«ãªããŸã§ã --experimental-modules
ãè¶
ããesmããå§ãããŸãã ããã¯ããªãã®åŸ
ã¡æéã«ãªããŸãã
@boneskull
ãããããããšãã ç§ã¯7æãããã§ã«c8
ã«åãçµãã§ããŸãïŒãã®ãªããžããªã§ããããã®PRãšåé¡ãéããŸããïŒã åæããªãèšèšäžã®æ±ºå®ããããããã»ãšãã©ã®äŸåé¢ä¿ãå
±æããããšãïŒããšãã°ãããŒãžã¢ã«ãŽãªãºã ãäœæããŸããïŒãå¥ã®ããŒã«c88ãå
¬éããããšã«ããŸããã ä»é±ã®çµããã«åäœããããã«ãªããçŸåšã©ã€ãã©ãªã§ãã¹ãããŠããŸãã CIã®ãã€ãã£ãESMãšã¢ã«ã§äœ¿çšã§ããŸãã ææžåããŠä¿®æ£ããã«ã¯ãŸã æéãå¿
èŠã§ããã1æã«æºåãæŽãã¯ãã§ãïŒã
@jrgleason
ç§ã¯é ã®ãŠã£ãºãã®äžã«ã³ãŒããæžããŸããã ããã§ã®åé¡ã¯ã globSync
ã./
ãŸãã¯../
ã§å§ãŸããªãçžå¯Ÿãã¹ãè¿ãããšã§ããããã§ãã ./
ãåã«ä»ããããšããå§ãããŸããåçŽãªçžå¯Ÿãã¹ã§æ©èœããã¯ãã§ãã
ãŸããåçã€ã³ããŒãã§ã¯çžå¯ŸURLã䜿çšãããããšã«ã泚æããŠãã ããã #
ã ?
ãããã³ãã®ä»ã®ç¹æ®æåã¯ç°ãªãæ¹æ³ã§åŠçãããå ŽåããããŸãã å
åºãªãœãªã¥ãŒã·ã§ã³ãå¿
èŠãªå Žåã¯ãã¢ãžã¥ãŒã«ã®çµ¶å¯Ÿãã¹ã解決ããŠããããã¡ã€ã«URLã«å€æããå¿
èŠããããŸãã ã«ãã¬ããžã«é¢ããäœæ¥ã®äžç°ãšããŠã絶察ãã¹ãšURLã®éã§å€æããlibãäœæããŸããã furi
fromSysPath
ã䜿çšããããšããå§ãããŸãã å€æã§ã¯ãããããçš®é¡ã®ãã¹ïŒWindowsåå空éãUNCãã¹ãå«ãïŒãåŠçããå¿
èŠããããŸãã
å®å šãªäŸã¯æ¬¡ã®ããã«ãªããŸãã
const {fromSysPath} = require("furi");
const {sync: globSync} = require("glob");
const {resolve} = require("path");
(async () => {
const matches = globSync("**/*.spec.mjs");
for (const match of matches) {
await import(fromSysPath(resolve(match)).href);
}
run();
})();
ã€ãŸãã mocha --require esm
ã¯ããŸãæ©èœããŸãããïŒ æ¬åœã«èªåæ€åºãå¿
èŠã§ããïŒ ããã¯é£ããããã«èããããªãŒããŒããããè¿œå ããŸã...
@demurgosã§ãã€ããŒãªãªãŒã¹ãã«ããããã«ã¯ãv5.2.0以éã®ãã¹ãŠã®éãã¬ãŒã¯å€æŽããã©ã³ãã«ãã§ãªãŒããã¯ããŠãããããCHANGELOGã«ã³ã³ãã€ã«ããå¿ èŠããããŸãã ããªããŸãã¯ä»ã®èª°ãããã®ä»äºãåãã§è¡ãå Žåã¯ããªãªãŒã¹ãã«ããããããšãã§ããŸãã
ææ¡ããŠãããŠããããšãã NODE_OPTIONS
--experimental-modules
ãååŸããããšã¯ãŸã å¯èœã§ãããããåªå
床ã¯é«ããããŸããïŒãŸããgitããªãŒããã§ãªãŒããã¯ã³ããããè€éã«ããå¯èœæ§ããããŸãïŒã ä»ã®äŸåé¢ä¿ã§çºçããŠããåé¡ããªããšã解決ã§ããã°ãããã«æéãè²»ããããšãã§ãããã©ããã確èªããŸãã ãããŸã§ã®éãç§ã¯v6ã®ãã€ã«ã¹ããŒã³ã«æ³šç®ããŠããŸãã
fwiw Node.jsã®ã¹ããŒãªãŒããŸã£ããã«ãªããŸã§ã
--experimental-modules
ããã$esm
ããå§ãããŸãã ããã¯ããªãã®åŸ ã¡æéã«ãªããŸãã
ã€ãŸããmocha --require esmã¯æ©èœããŸãããïŒ
ç§ã¯ãããä»ã®ãšããæè¯ã®è§£æ±ºçã§ããããšã«ééããªãåæããŸãïŒããã¯ã»ããã¢ããããã®ãæãç°¡åãªè§£æ±ºçã§ããããã°ããã®éåºåã£ãŠããŸãïŒããã¯æ©èœããŸãã ç§ã®å Žåãç§ã¯ç¬èªã®ãã«ãããŒã«ãç¶æããŠãããåŸæ¥ã®CJSãã«ãã®ä»£ããã«ãã€ãã£ãESMãåŠçããŠããŸãã ãã€ãã£ãESMã«æ¬åœã«ç±å¿ã§ãããã³ãŒããå®è¡ããå¯äžã®æ¹æ³ãšããŠäœ¿çšããªãããšããå§ãããŸããçµå±ã®ãšãããããã¯å®éšçãªãã®ã§ãïŒstuck_out_tongue :ã
ç§ã®æè¿ã®ã¡ãã»ãŒãžã®ã»ãšãã©ã¯ããã€ãã£ãESMã䜿çšããŠå®è¡ã§ããããšãå
±æããããšã«é¢ãããã®ã§ãã ããã¯äž»ã«å®éšçãªäœæ¥ã§ãããããŒãã®ESMãå®å®ãããšãã«å€æŽããå¿
èŠããããšæããŸãã é·æçã«ã¯ã esm
ããã±ãŒãžãå¿
èŠãšããªããœãªã¥ãŒã·ã§ã³ãæã€ããšã«ã¯å©ç¹ããããŸãã ãããç§ã®çç±ã§ãïŒ
esm
ã®éã«ã¯ããšããžã±ãŒã¹ïŒè©äŸ¡ãšã©ãŒããµã€ã¯ã«ãããŒããšã©ãŒãéåæ/åçã¢ãžã¥ãŒã«ãwasmãªã©ïŒã«é¢ããŠããã€ãã®éããããå ŽåããããŸãã å圢ã³ãŒããäœæããå Žåãåäœã®çžéã®åå ãšãªãå¯èœæ§ã®ãããã®ãæžããæ¹ãå®å
šãªå ŽåããããŸãã ããããã€ãã£ãã«ãã¬ããžã«é¢é£ããŠããŸãã esm
ã䜿çšãããšãV8ã¯ãã©ã³ã¹ãã€ã«ãããåºåã確èªããããããœãŒã¹ããããåŠçããå¿
èŠããããŸãïŒ c8
ã§ã¯ãŸã ãµããŒããããŠããŸããããPRãæºåããŠããŸãã圌ãã¯c88
ã§åäœããŸãïŒã ãããã°æã«ä»ã®éãã衚瀺ãããå ŽåããããŸããæ¬åœã«èªåæ€åºãå¿ èŠã§ããïŒ ããã¯é£ããããã«èããããªãŒããŒããããè¿œå ããŸã...
ã©ã®èªåæ€åºãåç §ããŠãããããããŸããã ä»å¹Žåãã«éãããPRãšé¢ä¿ããããŸããïŒ
ç·šéïŒè©±ãåãããå Žåã¯ãããŒãããŒã«ã®SlackïŒäž»ã«#c8
ãã£ãã«ã§ã¢ã¯ãã£ãïŒã«ãåå ããŠããŸãã
@demurgosç§ã¯äººã ãããã§äœãæãã§ãããã«ã€ããŠå°ãæ··ä¹±ããŠãããšæããŸãã ãšããã...
NODE_OPTIONS=--experimental-modules
ãMocha v6.0.0ã§--experimental-modules
ããµããŒãããããŸã§æ©èœããå Žåããã®åé¡ã«å¯ŸããŠä»ã«è¡ãã¹ãäœæ¥ã¯ãããŸããïŒ ãããç§ãæ¬ ããŠãããã®ã§ãã
ãã®åé¡ã¯ããã€ãã£ãESMïŒããã©ã³ã¹ãã€ã©ãŒã䜿çšããªãES6ã¹ã¿ã€ã«ã®ãã¹ããïŒãããã«æ©èœãããŸã§ããŸãã¯CJSãçŸåšæ©èœããã®ãšåããããç°¡åã«æ©èœãããŸã§éãããŸãŸã«ãªããšæããŸãã
--delay
ãšNODE_OPTIONS=--experimental-modules
ã§æçš¿ãããœãªã¥ãŒã·ã§ã³ã¯ãé©åãªãµããŒããããåé¿çã§ãã mocha **/*.spec.mjs
ãå®è¡ããŠã¬ããŒããååŸã§ããããã«ãªã£ããããã®åé¡ã¯ä¿®æ£ããããšæããŸãã
æ®å¿µãªãããä»ã®ãšãããããŒããESMãµããŒããç解ããã®ãåŸ ã€å¿ èŠããããšæããŠããŸãã 確èªããå¿ èŠããããŸãããPRã¯èªåæ€åºã䜿çšãããåçã€ã³ããŒãã䜿çšããŠãã¹ãŠã®ã¢ãžã¥ãŒã«ïŒCJSãŸãã¯ESMïŒãã€ã³ããŒãããã ãã ãšæããŸãã å®è£ ã¯ãã¢ãžã¥ãŒã«ã®çžäºéçšã¹ããŒãªãŒã«äŸåããŸãã
ç·šéïŒ httpsïŒ//github.com/mochajs/mocha/pull/3253ãåç §ããŠããŸãã ãã¹ãŠã®ã¢ãžã¥ãŒã«ãESMãšããŠããŒãã§ããŸãïŒèªåæ€åºãªãïŒã
ç§ã¯ãåé¡ããªããã©ãããç£èŠãããããã§ãã
ãã®åé¡ã«ã¯æè¿ã®ã¢ã¯ãã£ããã£ã¯ãããŸããã stale
ãšããã©ãã«ãä»ããŠããŸãã 14æ¥ä»¥å
ã«ããã以äžã®ã³ã¡ã³ããã¢ã¯ãã£ããã£ããªãå Žåã¯ããã®åé¡ãã¯ããŒãºããŸãã
ã¢ã«ã«è²¢ç®ããŠãããŠããããšãïŒ
ããŒã12ã«ã¯ãæ°ããESMå®è£ ãå«ãŸããŠããå¿ èŠããããŸãã ã¢ã«ã§ESã¢ãžã¥ãŒã«ããµããŒãããæ¹æ³ã確èªããæ©äŒã«ãªããŸãã
Mocha ESMã䜿çšããŠãããšãã«GCã®ãã°ãçºçããŸããããå ±åããã³ç¢ºèªãããŠãããããä¿®æ£ããå¿ èŠããããŸãïŒ httpsïŒ//github.com/nodejs/node/issues/27492ã
ãã®ãã°ã®ã»ãã«ãäžèšã®ç§ã®ã³ã¡ã³ãã§èª¬æãããŠããæŠç¥ã¯ãESMã§ã¢ã«ã䜿çšããããã«åŒãç¶ãæ©èœããŸãã
ããã«ã¡ã¯ã¢ã«ã®äººã ãçŽ æµãªããŒã«ãäœæããŠç¶æããŠãããŠããããšãïŒ
ããã¯åèãŸã§ã®ã³ã¡ã³ãã§ãã éå»æ°ã¶æéãç§ã¯ä»¥äžã®ãããªãããã䜿çšããŠãã¢ã«ãš* -test.mjs
ã«åãçµãã§ããŸããã mocha test/*.mjs
ãå®è¡ããã®ã«ã»ãšãã©åé¡ã¯ãããŸããïŒãã©ã³ã¹ãã€ã©ãŒãŸãã¯esm
npmã¢ãžã¥ãŒã«ãªãã§ïŒã
https://gist.github.com/tadd/756d21bad38933c179f10e59bddee6b4
ãã¡ããããã®ãããã¯Mochaã³ããã¿ãŒã«ãšã£ãŠãæ¬çªç°å¢å¯Ÿå¿ãã§ã¯ãããŸããã ããã¯ããã¹ãã³ãŒãã§ESMãã§ããã ãæ©ã䜿çšãããMochaãŠãŒã¶ãŒã«ãšã£ãŠã¯åãªãããã¯ã§ãã
ç§ã¯--experimental-modules
ãªãã·ã§ã³ã§Node.jsv11ã䜿çšããŸããã çŸåšãç§ã¯v12ã䜿çšããŠãããåäœããŸãã
å¥ã®è©±ã§ãããããŒãv12ã§ã¯$ïŒ$ package.json
$ïŒ$ã«.cjs
æ¡åŒµæ©èœãš"type"
ãã£ãŒã«ããå°å
¥ãããŸããã ããããèæ
®ããå¿
èŠãããããã§ãã
ããã«ã¡ã¯ã¢ã«ã®äººã ãçŽ æµãªããŒã«ãäœæããŠç¶æããŠãããŠããããšãïŒ
確ãã«ããããŠç§ãæè¬ããããšæããŸãð
loadFilesã®åæãç¶æããããã«ãå¥ã®ã¢ãããŒããæ¡çšããŸããã以äžãåç
§ããŠãã ããã ããã¯2æ以æ¥ç§ã®ããã«åããŠããŸãã ä»ã®ããã€ãã®ããã¯ãšã¯ç°ãªããããã«ããã c8ã䜿çšããŠããã¹ãŠã®ãã©ã°ãæ€æ»/ devtoolsãããã³æ£ç¢ºãªã³ãŒãã«ãã¬ããžãå¯èœã«ãªããŸãã esm
ããã±ãŒãžã«ã¯ãã¡ã€ã«ããšã«ç°ãªããªãã»ãããããããããã®æåŸã®æ©èœããã€ãã£ãESMãæ¬åœã«å¿
èŠãšããçç±ã§ãã ïŒã¢ãžã¥ãŒã«ã®ãšã¯ã¹ããŒããäžèŠ§è¡šç€ºãããæ··ä¹±ãæããŸãïŒã
https://gist.github.com/maxnordlund/a860dd67013beaf0f31ce776536f0a47
ããã«ã¡ã¯ïŒ ããã¯ããã€ãã£ãES6ãããžã§ã¯ãã«äŸåããã³ãŒãïŒ lit-elementãªã©ïŒããã¹ãããå Žåã«ãå¿ èŠã§ãã ãã以å€ã®å Žåã¯ã次ã®ããã«ã¹ããŒãããŸãã
node_modules/lit-element/lit-element.js:14
import { TemplateResult } from 'lit-html';
^
SyntaxError: Unexpected token {
at Module._compile (internal/modules/cjs/loader.js:703:23)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:770:10)
at Module.load (internal/modules/cjs/loader.js:628:32)
at Function.Module._load (internal/modules/cjs/loader.js:555:12)
at Module.require (internal/modules/cjs/loader.js:666:19)
at require (internal/modules/cjs/helpers.js:16:16)
...
ããã«å¯Ÿããåé¿çããããã©ããã¯ããããŸããããçŸåšãES6ãã€ãã£ããã¬ãŒã ã¯ãŒã¯ã§Mochaã䜿çšããæ¹æ³ã¯ãªããšæããŸãã
@heruanäžèšã®ã³ã¡ã³ãã§ãããŒã8以éã«æ©èœãããœãªã¥ãŒã·ã§ã³ãæçš¿ããŸããã ãã€ãã£ããã¡ã€ã«ã®URLå€æã«ããŒã10.12ãå¿ èŠãªæŽæ°ããŒãžã§ã³ã¯æ¬¡ã®ãšããã§ãã
次ã®test.esm.js
ãã¡ã€ã«ãè¿œå ããŸãã
const {pathToFileURL} = require("url");
const {sync: globSync} = require("glob");
const {resolve} = require("path");
(async () => {
const matches = globSync("**/*.spec.mjs"); // Change the glob to match your test files
for (const match of matches) {
await import(pathToFileURL(resolve(match)).href);
}
run();
})();
次ã«ã mocha --experimental-modules --delay test.esm.js
ã䜿çšããŠãã¹ããå®è¡ããŸãã
ãã®ã³ãŒãã¯ãESMãã¹ããããŒãããããã®commonjsããªããžãšããŠtest.esm.js
ã䜿çšããããšã§æ©èœããŸãã
ããŒã12ã«ã¯ãIIAFEãGCïŒnodejs / nodeïŒ27492ïŒã«ãã£ãŠåéããããšããåé¡ãå ±åãããŠããŸãã次ã®ãã€ããŒããŒãžã§ã³ã®ããããã§ä¿®æ£ããå¿ èŠããããŸãïŒããã€ãã®åé¿çããããããããŸãããããŸã 調ã¹ãŠããŸããïŒã ä¿®æ£ããããŸã§ãææ°ã®Node10ããŒãžã§ã³ã䜿çšããããšããå§ãããŸãã
ãšã©ãŒãçºçããå ŽåãTharã¯UnhandledPromiseRejectionWarning
èŠåãããªã¬ãŒããŸãã console.error
ããã§ãŒã³ãããããšã©ãŒãåŠçããããšããå§ãããŸãã
import glob from "glob"
import { pathToFileURL } from "url"
import { resolve } from "path"
import { promisify } from "util"
const globAsync = promisify(glob)
async function main() {
const matches = await glob("test/**/*.mjs")
for (const match of matches) {
await import(pathToFileURL(resolve(match)).href)
}
run()
}
main().catch(console.error)
_ãããrequire
import
ã䜿çšããŠããããšã¯ç¥ã£ãŠããŸãããESMã®åå°ã«ãšã©ãŸãããšãã§ãã解決çã«ã€ããŠã¯ç§ã®èŠç¹ãåç
§ããŠãã ãã_
@demurgos10æ¥åã«æçš¿ããNode10.12ã®ã³ãŒãã¹ãããããããããšãïŒ
ããŒã12.1ãå®è¡ããŠããŸãããæ£åžžã«åäœããŠããããã§ãã ããã¯ããã«ã¢ã«ã«è¿œå ãããŸããããããšãããŒã12ã§ãããè¡ãããã«ç°¡åãªæ¹æ³ã¯ãããŸããïŒ ãŸããããã--watch
ã¢ãŒãã§äœ¿çšããã«ã¯ã©ãããã°ããã§ããïŒ
https://github.com/standard-things/esmã¯--require esm
ã§ããã«æ©èœããããã§ãããå¥ã®äŸåé¢ä¿ãæšãŠãã®ã¯çŽ æŽãããããšã§ã:)ããããšãã
MochaããœãŒã¹ã§ESMã«åãæ¿ããå ŽåãRollupã¯ESMé åžãã¡ã€ã«ãšCommonJSããã³/ãŸãã¯UMDãã¡ã€ã«ãæäŸã§ããŸãã
ããã§ã®ãã1ã€ã®å©ç¹ã¯ãMochaãåã蟌ãããã«ãã©ãŠã¶ã®HTMLãè¿œå ã®ã¹ã¯ãªããã¿ã°ã§æ±æããå¿ èŠããªãããšã§ãã ãã¹ããã¡ã€ã«ïŒãŸãã¯ã¡ã€ã³ã®ãã¹ããšã³ãã©ã³ã¹ãã¡ã€ã«ïŒã¯ã€ã³ããŒããå®è¡ã§ããŸãïŒå€æ°ãã©ãããæ¥ãŠããããææ¡ããéãããã¹ããã¡ã€ã«å ã®ãéæ³ããåé¿ã§ããŸããã€ã³ããŒããã¹ããã¬ãŒã¹ããã ãã§æžã¿ãŸãïŒã
ããŒã«ã¢ããçšã®CSSãã©ã°ã€ã³ã䜿çšããŠã mocha.css
ãæ¿å
¥ã§ããããã«ããHTMLã®ä¹±éãã®å¿
èŠæ§ãããã«æå°éã«æããããšãã§ããŸãã
ç§ã¯ãåé¡ããªããã©ãããç£èŠãããããã§ãã
ãã®åé¡ã«ã¯æè¿ã®ã¢ã¯ãã£ããã£ã¯ãããŸããã stale
ãšããã©ãã«ãä»ããŠããŸãã 14æ¥ä»¥å
ã«ããã以äžã®ã³ã¡ã³ããã¢ã¯ãã£ããã£ããªãå Žåã¯ããã®åé¡ãã¯ããŒãºããŸãã
ã¢ã«ã«è²¢ç®ããŠãããŠããããšãïŒ
ããã¯ãŸã é¢ä¿ããããšæããŸãã
誰ããES6ã¢ãžã¥ãŒã«ã§MochaãïŒç·šéïŒãTravisãïŒããŒã> = 12.11.0ã§å®è¡ã§ããŸãããïŒ
12.10.0ã§ã¯ãæ£åžžã«èšå®ãããããã§ãã
mocha-run.js
(async () => {
await import("./tests.js");
run();
})();
次ã«ã mocha --experimental-modules --delay ./mocha-run.js
ã¯é
åã®ããã«æ©èœããŸãã
ãããããªãããã®çç±ã§ã12.11.0ã§ã¯ã --delay
ãã©ã¡ãŒã¿ããªããã®ããã«åäœããŸãã
> mocha --experimental-modules --delay ./mocha-run.js
(node:6439) ExperimentalWarning: The ESM module loader is experimental.
internal/modules/cjs/loader.js:1007
internalBinding('errors').triggerUncaughtException(
^
Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /home/travis/build/Palindrom/Palindrom/mocha-run.js
@tomalecããŒã12.11.1ã§ESã¢ãžã¥ãŒã«ã䜿çšããŠmochaãå®è¡ããŠããŸãã
__mocha-run.js__
(async () => {
await import("./tests.mjs");
run();
})();
ãã ããç£èŠã¢ãŒãã¯æ©èœããŠããŸããã mochaã¯ãã¡ã€ã«ã®å€æŽãåŸ ã¡ãŸããããã¡ã€ã«ãå€æŽãããåŸã¯å¥ã®ãã¹ãå®è¡ãå®è¡ããŸããã
@vansllyã©ãããŒããªã;ïŒ
Node 12.12.0ïŒhttps://travis-ci.org/Palindrom/Palindrom/builds/597771311#L450ïŒãšãäžèšã§ææ¡ããmocha-run.js
ïŒhttps://github.com/Palindrom/ïŒã䜿çšããŠããç§ã«ãšã£ãŠã¯Palindrom / commit / 49835962bdd61c849f115e271bbc6c3f82d30511ïŒdiff-24eabf03aee8844b2b4747aa95a6af7dïŒã
mocha --experimental-modules --delay test/mocha-run.js
https://travis-ci.org/Palindrom/Palindrom/builds/597771311#L643 ããã¯åŒãç¶ãåããšã©ãŒãã¹ããŒããŸã
ããããŸã åé¡ã§ãããšããããšã¯ã¯ã¬ã€ãžãŒã§ãïŒ ESMã¯--experimental-modulesã®èåŸã«é ãããªããªããŸããã ãããæªæ¥ã§ãã
ããŒãšãå®ã¯æ°æ¥åã«çºè¡šãããã°ããã§ã...
é ãããŸãâç§ãã¡ã¯çJestã«åãæ¿ããŸããã
ããã¿ããªããããçããŠããããšã確èªãããã ãã§ãã ãããæåªå ã«ããŠãã ããããããŠãã¹ãŠã®çŽ æŽãããä»äºã«æè¬ããŸãïŒ
@luijarããã¯ïŒ4038ã§äœæ¥äžã§ã
æšæ¥ãå®éšçãªãªãªãŒã¹v7.0.0-esm1
ãå
¬éããŸããããªãªãŒã¹ããŒããåç
§ããŠãã ããã
ããã¯èŠãã®ãçŽ æŽãããã§ãïŒ
ãã ãã質åã§ããŸããïŒãã©ãŠã¶ãŒãžã®åç §ããªããšããããšã¯ããã©ãŠã¶ãŒã§ESMã䜿çšã§ããªãããšãæå³ããã®ã§ããããããããšãåã«Nodeã®ããã«ãã©ãŠã¶ãŒã®ããŒãžã§ã³ãæå®ããå¿ èŠããªãããšãæå³ããã®ã§ããããã ãªãªãŒã¹ããŒãã§ãã©ãŠã¶ã®ã¹ããŒã¿ã¹ïŒãµããŒããããŠããªãå Žåã¯ããµããŒãã®èšç»ïŒã«ã€ããŠèšåãããšåœ¹ç«ã€ãšæããŸãã
@ brettz9
NodeJsESMã¯Mochaãã©ãŠã¶ã«ãŸã£ãã圱é¿ãäžããŸããã ãã©ãŠã¶ã§å®è¡ãããã¹ãã¯NodeJã«ãã£ãŠèªã¿èŸŒãŸããŸãããããã¯ãHTMLã³ãŒãã§èªåã§è¡ãå¿
èŠããããŸãã
ããèŠããŠãããªãã <script>
ã¿ã°ãtype="module"
å±æ§ã«èšå®ããå¿
èŠããããŸãã ããŒãã·ãŒã±ã³ã¹ãç¶æããããã«ããã¹ããã¡ã€ã«ãšMochaã¹ã¯ãªããã®äž¡æ¹ã«å¯ŸããŠã ESMã¯äœå¹Žãã®éãã©ãŠã¶ã§åäœããŠããã¯ãã§ãã
@juergba ïŒã¯ãã確ãã§ãããã³ã³ãã€ã«ããã«import mocha from '../node_modules/mocha/mocha-esm.js';
ãªã©ã䜿çšã§ããããã«ãESMãšã¯ã¹ããŒãé
åžãã¡ã€ã«ãå¿
èŠã§ããã³ã³ãã€ã«ã䜿çšããå ŽåïŒããšãã°ã import mocha from 'mocha';
ã ãã䜿çšã§ããããã«ããããïŒã package.json
ã«module
ãå¿
èŠã§ãã
mochaã¯commonjsã§æžãããŠããŸãã package.jsonã«ãã¢ãžã¥ãŒã«ããã£ãŒã«ããé 眮ããããšã¯ã§ããŸããã Mochaã¯ãESMã§èšè¿°ãããããŒãã§ã®ãã¹ãã®å®è¡ããµããŒãããŸãã
ESMãå
éšã§äœ¿çšããããã«ãªãã¡ã¯ã¿ãªã³ã°ããããªãå Žåã§ãã module
ããµããŒãããããã«CommonJSãã©ã°ã€ã³ã§Rollupã䜿çšããESMã¿ãŒã²ãããã¡ã€ã«ãæå®ã§ããã¯ãã§ãïŒSinonãªãã¡ãŒãç§ãééããããšã«æ³šæããŠãã ãããjQueryã¯ä»ã®å¯äžã®æ³šç®ãã¹ãäŸå€ã§ãããESMã䜿çšããããã«ãªãã¡ã¯ã¿ãªã³ã°ãããŠããŸãïŒã
ESMã§mochaããã¹ãããããã®ãµã³ãã«ãããžã§ã¯ããäœæããŸããã ãã¹ãã¯æ£åžžã«å®è¡ã§ããŸããããïŒ_ãŸã _ïŒnyc / istanbulã§ã«ãã¬ããžãå®è¡ã§ããŸããã§ããã ããªãã®å©ãã¯å€§æè¿ã§ãã
@concatime nyc
ãäºææ§ãæã€ããã«ãªããŸã§ã c8
ã䜿çšã§ããŸãïŒ https ïŒ//www.npmjs.com/package/c8
c8 --all --include=lib/**/*.js --reporter=lcovonly node_modules/.bin/mocha --recursive
@cedxãã³ãã¬ãŒããªããžããªãæŽæ°ããŸããããæ©èœããŸãã ãã¡ããšããïŒ
ããŒãã®ãã€ãã£ãESMãµããŒããMochav7.1.0ã«å®è£ ããŸããã
æãåèã«ãªãã³ã¡ã³ã
ããŒãã®ãã€ãã£ãESMãµããŒããMochav7.1.0ã«å®è£ ããŸããã