Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

模块化 #6

Open
791045873 opened this issue Dec 5, 2018 · 0 comments
Open

模块化 #6

791045873 opened this issue Dec 5, 2018 · 0 comments

Comments

@791045873
Copy link
Owner

JS模块化大概有三种主流的方式,包括历史上存在过的,但是目前已经很少使用的。
分别为:CMD(sea.js)、AMD(require.js)、CommonJS(nodeJs)
CMD、AMD、CommonJS是三种模块化的规范。括号内的则是对应该规范的实际实现。
除了这三种之外,目前还存在ES6中的import与export规范。只是目前除了在NodeJs比较高的版本中有实验性质的实现之外,并无其他实现。而我们在代码中使用它的时候,都是经过了babel的编译,转换成了require方法。(该require具体是cmd实现,还是amd实现我就不清楚了,没有深入研究)

CommonJs

由于CommonJs是NodeJs在客户端的模块化方式,所以它加载文件是通过IO同步读取文件内容的。
原理大概为:
读取文件后得到该Js文件的内容字符串。用Function构造函数包裹该字符串后调用执行,得到返回结果。

AMD CMD

AMD规范对应的是requireJs。由于CommonJs是在node端同步加载模块,这样的方式必然不能被浏览器所接受。故而,AMD与CMD都是模块异步加载的的相关规范。
那么AMD与CMD,seaJs与requireJs有什么区别呢?
关于规范具体细节的区别,例如define、require等api的细节不在此描述。仅说一下他们最大的区别。
使用requireJs去require一个模块的时候,requireJs会等待所有的依赖全部被加载结束后,以回调的方式去调用你的业务代码。即,他是先执行的依赖代码,再执行的业务代码。
而seaJs则不同,每当运行你的业务代码时,seaJs都会通过正则去匹配你的代码中是否有require关键字。如果有,则异步加载所有的依赖模块。但是,只有等业务代码运行到require方法时,才真正的执行之前加载的模块代码。即,需要使用依赖模块的时候,才执行依赖模块的代码。

值得一提的是,在CMD与CommonJs中,export都是module.export的引用。所以,对export的重新赋值,会导致module.export上并无想要的内容。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant