coderwhy课程笔记(6)
node基础学习:
Node中有些所谓的全局对象,其实并不是真正的全局对象,而是属于模块的变量,只是在每个模块中都存在,看起来像是全局的。包括:__dirname, __filename, exports, module, require()
setImmediate(): 立即执行
process.nextTick(): 与事件循环有关
node中的global和浏览器中的window最主要的区别:var变量不会加到global里
node中每个文件都是一个单独的模块,采用CommonJS规范。模块中有CommonJS的核心变量,exports, require, module.exports等。const bar = require("bar.js"),这句话的意思是,把bar.js中的module.exports对象赋值给bar变量,两个文件模块共享同一个对象。

注意真实开发中一般通过上图的方式进行模块化。(此时exports和module.exports是两个不同的对象)。
关于node中的require查找规则:
情况一: require的参数可以是一个node 核心模块

情况三:名称参数不是路径,也不是内置模块
去node_modules目录下找这个参数为名称的目录,找下面的index.js。
关于模块的加载,有如下规则:
- 模块第一次被引入时,模块中的js代码会运行一次
- 模块多次引入时,会缓存,最终只加载(运行)一次。(用module.loaded来做标记位)
- 如果有循环引入,加载顺序是DFS
CommonJS的模块加载的缺点:同步加载,阻塞式的(服务器中加载一般是本地加载,可以接受,但是浏览器客户端从网络加载的话,会阻塞后面的js代码的执行。)所以在浏览器中一般不使用CommonJS规范。(webpack会使用require对代码进行打包, 是另外一回事)
早期(ES6 引入ES Modules之前),浏览器一般使用AMD/CMD对代码进行模块化。
AMD: Asynchronous Modules Definition. 异步模块定义。AMD实现常用的库是require.js。
CMD: Common Module Definition, 通用模块定义。常用实现:SeaJS。