关于node你应该知道的一些事

起这么个名字主要是为了自己备忘

1. 原生node使用的是CommonJS 

2. CommonJS, TypeScript, ES6 是三种不同的Javascript

3. 通过 babel 等库, 上面这3种 Javascript都可以被编译成在浏览器端可以运行的代码

4. CommonJS里每个文件都是一个模块, 每个模块有自己的作用域, 其中的变量和方法都是私有的

5. CommonJS通过module.exports变量导出变量和方法, Node还会为每个模块提供var exports = module.exports; 所以可以直接使用exports变量

6. require 是运行时调用, 所以require理论上可以运用在代码的任何地方

7. import 是编译时调用, 所以必需放在文件开头

8. require 是赋值过程, require的结果就是对象,数字,字符串或者函数等

9. import 是解构过程, 但是目前所有的引擎都没有实现import, 所以在node中使用的ES6 import 都需要babel转为ES5代码之后才能运行

10. require是一种社区方案,提供了模块加载方案, 非语言标准. 只能在运行时确定模块的依赖关系及输入输出变量, 无法进行静态优化

11. import 是语言规格支持的模块功能, 支持编译时静态分析, 便于js引入宏和类型检验. 动态绑定

12. CommonJS 的模块exports如果是基本类型, 属于复制, 会被模块缓存; 对于复杂类型, 属于浅拷贝, 因此对该模块的值做修改时会影响其他模块

13. 使用require命令加载某个模块时, 会运行模块的代码. 第二次加载时会从缓存拿

14. ES6 模块的值属于动态只读, 只读变量无法修改, 但是如果被引用模块内的值改变了, 那调用方使用的”只读变量”会跟着改变

15. 存在循环依赖时, CommonJS的做法是,一旦出现某个模块被”循环加载”,就只输出已经执行的部分,还未执行的部分不会输出。

16. ES6根本不会关心是否发生了”循环加载”,只是生成一个指向被加载模块的引用,需要开发者自己保证,真正取值的时候能够取到值

17. Javascript 是基于事件循环的, 也就意味着当一个运算需要大量时间来处理时, 应用会变得无响应. 所以可能的话, 将一个函数分割成小函数写