node教程,对比理解es模块代码写法不同导致运算结果不同
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
大家已经知道,在nodejs
代码的写法上,目前存在着两个阵营,分别是以require
为代表的commonjs
阵营,还有以import
为代表的es module
阵营。本文的故事,发生在后者身上:es module
阵营。从一个模块中导出一个变量,经过计算后,发生了不同的变化。
苏南大叔的程序如此灵动博客,记录苏南大叔和计算机代码的故事。测试环境:node@16.14.2
。本文的代码文件后缀都是.mjs
,否则可能会有各种奇怪报错,这里不做赘述。
主体逻辑(相同部分)
sunan.mjs
定义了一个变量和一个函数,分别是:
let who = "sunan大叔";
function hola() {
who = "苏南大叔";
}
// 以下是变化的部分
index.mjs
的主要逻辑,导入并执行:
// 导入方式是变化的部分
sunan.hola();
console.log(sunan.who);
第一种情况,export {}
+import * as
这种情况下,是分别导出,然后as
导入。sunan.mjs
:
export { who, hola }
index.mjs
:
import * as sunan from "./sunan.mjs";
结果修改了who
变量。运算结果是:
苏南大叔
第二种情况,export default {}
+import
sunan.mjs
:
export default { who, hola }
index.mjs
:
import sunan from "./sunan.mjs";
结果who
变量保持不变。运算结果是:
苏南大叔
情况一的变种,export
不集合到一个{}
再导出了,直接定义的时候就export
。比如:
export let who = "sunan大叔";
export function hola() {
who = "苏南大叔";
}
导入的时候,还是使用:
import * as sunan from "./sunan.mjs";
那么,运算结果还是被修改了,显示苏南大叔
。
如果试图直接使用:
import sunan from "./sunan.mjs";
会得到错误提示:
does not provide an export whod 'default'
情况一变种2
import {who,hola} from "./sunan.mjs";
hola();
console.log(who); // sunan大叔
情况二的变种,import * as
导出保持不变:
export default { who, hola }
导入的时候,使用:
import * as sunan from "./sunan.mjs";
那么,调用方式就发生了变化:
import * as sunan from "./sunan.mjs";
sunan.default.hola();
console.log(sunan.default.who);
调用结果还是没有修改变量,输出sunan大叔
。
基本结论
结论就是如果在导出的时候没有导出为default
,那么,变量就是可以被修改的(类似于通常意义上的类)。如果导出的是default
,那么对变量的修改就是不生效的(类似于编译后不变的理论)。
相关链接
结束语
更多奇奇怪怪的node
经验文章,请点击苏南大叔的博客:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。