1模块化

#node #cjs #esm

Node模块化基础知识

1.node默认js模式

node默认使用的时cjs(CommonJs),为第三包但是被默认支持(文件拓展名为cjs),其理念是文件即模块:
- 需要什么直接require引入
- 需要暴露什么直接exports / module.exports
- 引入时,可以不写js扩展名
- 默认入口文件为index.js

//在index.js中
const m1 = require("./m1")
//之后执行 node ./index.js output:{a:"lee",b:123}
//访问属性和方法可以使用dot的方式,本质exports会将所有变量包进一个对象中


//在m1.js中
exports = {
	a: "lee",
	b: 123
}
console.log(exports);

module对象

Node提供构建函数Module,所有模块都是其实例。相关解读文章

exports和module.exports的区别

简单来说,exports是指向module.exports的 let exports = module.exports。这样可以方便我们使用,但是不要将其复制,这样会切断联系。

所以使用的时候,要用 exports.xxx来暴露信息,而不是直接用=

2.ESM

这是es官方推出的模块化方式(文件拓展名为mjs),现在也被绝大多数浏览器支持。有如下特点:
- 导入使用import, 使用as起别名,基本形式import xxx from "./xxx.js"
- 对于default暴露的可以直接引用名称,对于非default暴露的请使用{}来引用
- 组合导入,请先引入default,再引入其他
- esm默认都是运行在严格模式下
- html文件若是想模块化引入,请在script标签下加上type="module"

//在index.js中
import m2,{a} from "./m2.js"

m2(); //调用会直接使用function(){}
a; //10


//在模块文件m2.js中,直接使用export关键字
export let a = 10;
export default function(){
	console.log("我是默认导出函数");
}

个人更加倾向于这种模块化的形式,符合当今主流语言。如果想开启这种形式,请在package.json中使用type=module