node --experimental-modules & node.js ES Modules
node --experimental-modules & node.js ES Modules
how to run esm modules in node.js cli
$ node -v
# v12.18.0
$ uname -a
# Darwin xgqfrms-mbp.local 19.5.0 Darwin Kernel Version 19.5.0: Tue May 26 20:41:44 PDT 2020; root:xnu-6153.121.2~2/RELEASE_X86_64 x86_64
.mjs
& "type": "module",
https://nodejs.org/api/esm.html#esm_enabling
https://nodejs.org/api/esm.html#esm_package_json_type_field
https://nodejs.org/api/esm.html#esm_input_type_flag
.mjs
// package.json
{
"type": "module"
}
--experimental-modules
# node --experimental-modules
# ✅ must include `.mjs` file extension name
$ node --experimental-modules esm-node.mjs
$ node --experimental-modules --input-type=module ./esm-node.mjs
.js
bug ❌
// .js
import { a } from "./esm-modules";
import { b } from "./esm-modules";
// import { c } from "./esm-modules";
// import { d } from "./esm-modules";
import esm from "./esm-modules.mjs";
const log = console.log;
log(`a =`, a)
log(`b =`, b)
log(`c =`, esm.c)
log(`d =`, esm.d)
.mjs
solution ✅
you must import es module with the
.mjs
file extension name
// defualt `.js` ❌
/*
import { a } from "./esm-modules";
import { b } from "./esm-modules";
import { c } from "./esm-modules";
import { d } from "./esm-modules";
*/
// .mjs ✅
import { a } from "./esm-modules.mjs";
import { b } from "./esm-modules.mjs";
// import { c } from "./esm-modules.mjs";
// import { d } from "./esm-modules.mjs";
import esm from "./esm-modules.mjs";
module.exports & exports
CJS Modules
// CJS Modules
/*
exports.a = 1;
exports.b = 2;
exports.c = 3;
exports.d = 4;
// exports = { a: 1, b: 2, c: 3, d: 4 }
*/
exports.a = 1;
exports.b = 2;
module.exports = { c: 3 };
module.exports.d = 4;
// module.exports = { c: 3, d: 4 }
✅ 结论
-
exports
just shorthand ofmodule.exports
-
if exist both
exports
&module.exports
,module.exports
will be overwrittenexports
⚠️ -
best practice, just using
module.exports
as possible as you can
exports.a = 1;
exports.b = 2;
module.exports = { c: 3 };
module.exports.d = 4;
// module.exports = { c: 3, d: 4 }
console.log(module);
exports.a = 1;
exports.b = 2;
module.exports = { c: 3 };
module.exports.d = 4;
// module.exports = { c: 3, d: 4 }
module.exports.hello = true; // Exported from require of module
exports = { hello: false }; // Not exported, only available in the module
console.log(`hello =`, exports);
console.log(module);
https://www.hacksparrow.com/nodejs/exports-vs-module-exports.html
export default & export
ESM Modules
/* eslint-disable no-unused-vars */
// eslint-disable-next-line no-unused-vars
const a = 1;
const b = 1;
const c = 1;
const d = 1;
const esm = {
// a,
// b,
c,
d,
};
export {
a,
b,
}
export default esm;
refs
https://developer.mozilla.org/en-US/docs/web/javascript/reference/statements/export
https://flaviocopes.com/how-to-enable-es-modules-nodejs/
https://2ality.com/2017/09/native-esm-node.html
https://blog.logrocket.com/how-to-use-ecmascript-modules-with-node-js/
https://github.com/nodejs/modules/blob/master/doc/plan-for-new-modules-implementation.md
https://scotch.io/tutorials/new-ecmascript-modules-in-node-v12/amp
©xgqfrms 2012-2020
www.cnblogs.com/xgqfrms 发布文章使用:只允许注册用户才可以访问!
原创文章,版权所有©️xgqfrms, 禁止转载 🈲️,侵权必究⚠️!
本文首发于博客园,作者:xgqfrms,原文链接:https://www.cnblogs.com/xgqfrms/p/13591967.html
未经授权禁止转载,违者必究!