我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

大家已经知道,在nodejs代码的写法上,目前存在着两个阵营,分别是以require为代表的commonjs阵营,还有以import为代表的es module阵营。本文的故事,发生在后者身上:es module阵营。从一个模块中导出一个变量,经过计算后,发生了不同的变化。

苏南大叔:node教程,对比理解es模块代码写法不同导致运算结果不同 - es模块代码写法不同导致差异
node教程,对比理解es模块代码写法不同导致运算结果不同(图7-1)

苏南大叔的程序如此灵动博客,记录苏南大叔和计算机代码的故事。测试环境:node@16.14.2。本文的代码文件后缀都是.mjs,否则可能会有各种奇怪报错,这里不做赘述。

主体逻辑(相同部分)

sunan.mjs定义了一个变量和一个函数,分别是:

let who = "sunan大叔";
function hola() {
    who = "苏南大叔";
}
// 以下是变化的部分

index.mjs的主要逻辑,导入并执行:

// 导入方式是变化的部分
sunan.hola();
console.log(sunan.who);

苏南大叔:node教程,对比理解es模块代码写法不同导致运算结果不同 - code-01
node教程,对比理解es模块代码写法不同导致运算结果不同(图7-2)

第一种情况,export {}+import * as

这种情况下,是分别导出,然后as导入。
sunan.mjs:

export { who, hola }

index.mjs:

import * as sunan from "./sunan.mjs";

结果修改了who变量。运算结果是:

苏南大叔

苏南大叔:node教程,对比理解es模块代码写法不同导致运算结果不同 - code-02
node教程,对比理解es模块代码写法不同导致运算结果不同(图7-3)

第二种情况,export default {}+import

sunan.mjs:

export default { who, hola }

index.mjs:

import sunan from "./sunan.mjs";

结果who变量保持不变。运算结果是:

苏南大叔

苏南大叔:node教程,对比理解es模块代码写法不同导致运算结果不同 - code-03
node教程,对比理解es模块代码写法不同导致运算结果不同(图7-4)

情况一的变种,export

不集合到一个{}再导出了,直接定义的时候就export。比如:

export let who = "sunan大叔";
export function hola() {
    who = "苏南大叔";
}

导入的时候,还是使用:

import * as sunan from "./sunan.mjs";

那么,运算结果还是被修改了,显示苏南大叔

苏南大叔:node教程,对比理解es模块代码写法不同导致运算结果不同 - error-01
node教程,对比理解es模块代码写法不同导致运算结果不同(图7-5)

如果试图直接使用:

import sunan from "./sunan.mjs";

会得到错误提示:

does not provide an export whod 'default'

情况一变种2

import {who,hola} from "./sunan.mjs";
hola();
console.log(who);  // sunan大叔

苏南大叔:node教程,对比理解es模块代码写法不同导致运算结果不同 - code-04
node教程,对比理解es模块代码写法不同导致运算结果不同(图7-6)

情况二的变种,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大叔

苏南大叔:node教程,对比理解es模块代码写法不同导致运算结果不同 - code-05
node教程,对比理解es模块代码写法不同导致运算结果不同(图7-7)

基本结论

结论就是如果在导出的时候没有导出为default,那么,变量就是可以被修改的(类似于通常意义上的类)。如果导出的是default,那么对变量的修改就是不生效的(类似于编译后不变的理论)。

相关链接

结束语

更多奇奇怪怪的node经验文章,请点击苏南大叔的博客:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   node