xgqfrms™, xgqfrms® : xgqfrms's offical website of cnblogs! xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!

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 }

✅ 结论

  1. exports just shorthand of module.exports

  2. if exist both exports & module.exports, module.exports will be overwritten exports ⚠️

  3. 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.sitepoint.com/understanding-module-exports-exports-node-js#whatsthedifferencebetweenmoduleexportsandexports

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, 禁止转载 🈲️,侵权必究⚠️!


posted @   xgqfrms  阅读(556)  评论(17编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2018-08-31 开放平台 & 小程序
2018-08-31 用户角色 & 权限管理
2018-08-31 Fetch & POST & JSON Server
2018-08-31 Cygwin64 Terminal
点击右上角即可分享
微信分享提示