前言
- 本笔记参考视频,李立超:BV1qN4y1A7jM p9-p13
模块化简介
- 模块化高内聚,低耦合,jquery算一种模块,但无法选择瑶引入模块的哪些内容
- commonjs模块化标准,社区定义的,nodejs默认使用;此外还有个ES模块化标准
CommonJS规范
- 引入模块使用require(“path”)函数来引入,
- 定义模块时,模块中的内容默认是不能被外部看见的,可以通过exports来设置向外暴露的内容
- 访问exports的方式有两种,exports和module.exports,两个对象全等,该对象作为require的返回值
- 可以通过exports.xxx=xxx一个一个暴露,也可以通过module.exports={xxx:xxx}的方式同时暴露多个值
- 引入自定义模块时,path以./或…/开头,扩展名可省略,node会按照js,json,node的顺序依次查找;引入核心模块时,直接写核心模块名字即可,也可以在核心模块前添加
node:
加快查找速度 - cjs为扩展名时,表示是一个CommonJS标准的模块,js在没有特殊配置时,也默认CommonJS模块
- 文件夹作为模块时,默认文件为index.js
- 原理,所有 CommonJS模块会被包装在一个函数中,(function(exports,require,moudle,
__filename
,__dirname
){ xxxxx });
ES模块化规范
- 使用ES模块,两种方式,使用mjs作为扩展名,或者修改package.json将模块化规范设置为ES模块
- ES模块虽然麻烦点,但性能好,还是异步的
- 向外导出内容,使用export;引入模块,import {a, b as hello, c} from “./路径.mjs”,官方标准下不可省略扩展名,abc与导出时的变量一一对应,可以使用as指定别名
- 设置默认导出,一个模块中只能有一个默认导出,export default function sum(a,b){retunr a+b };导入时,随便起别名且不需要括号,import hello from “./路径.mjs”
- 通过ES模块导入的内容都是常量,不能修改。ES模块都是运行在严格模式下的。
- ES模块化在浏览器中同样支持,但有兼容性问题,通常不会直接使用,结合打包工具使用。
核心模块
- 核心模块是node的内置模块,可以在node中直接使用,ES标准下全局对象的标准名应该为globalThis,在浏览器中指window,在node中指global
- process,表示当前的node进程,通过该对象可以获取进程的信息,或者对进程做各种操作,是一个全局变量可以直接使用;
- process常用方法:process.exit(状态码)结束当前进程,终止node;process.nextTick( () = > {})表示将函数插入到tick队列中,在微任务队列和宏任务队列之前执行。早期微任务队列的替代品
- path,非全局变量,需要引入,核心模块直接写名字即可;常用方法:path.resolve(),直接调用则返回当前工作目录的绝对路径,参数为相对路径时,生成绝对路径,这两种会根据工作目录的不同,返回不同的绝对路径;前两种方法一般不用,最终形态,path.resolve(__dirname,“相对路径”)
- fs,需要引入,node中的文件操作,I/O;
- fs常用方法:fs.readFileSync(“最好使用path生成的绝对路径”),同步读取文件,会阻塞,不推荐使用
- 异步读取,fs.readFile(path,(err,buffer)=>{}),容易出现回调地狱
- 使用promise版fs方法,引入require(fs/promise),fs.readFile().then().catch()或者使用立即执行函数+async+await的方式解决
- fs.appendFile(path,data),创建新文件,或将数据添加到已有文件中。
- fs.mkdir(path,可选参数),创建目录
- fs.rmdir(path,可选参数),删除目录
- fs.rm(),删除文件
- fs.rename(path,path),重命名,相当于剪切
- fs.copyFile(path,path),复制文件,相当于复制