初学者学习web前端要注意什么?如何学好JS模块化编程?JavaScript是前端三要素之一,也是很多Web前端初学者遇到的第一道坎。很多同学表示,JavaScript涵盖的知识点太多太复杂,应用五花八门,一头雾水。但是只要我们从基础到高级一点一点的学习,就一定能够学好JavaScript。接下来,我将与大家分享关于JavaScript模块化编程的知识。模块是实现特定功能的一组方法。模块化是一种规范,也是一种约束,会大大提高开发效率。JS模块化的思想是把每个JS文件看成一个模块,每个模块以固定的方式引入,以固定的方式暴露指定的内容。模块化需要实现的功能1.解决命名冲突。当代码达到一定规模,功能较多时,就会出现命名冲突,而模块化可以很好地解决命名冲突问题。在这里,小编建了一个前端学习交流按钮群:132667127,自己整理的最新前端资料和进阶开发教程。如果愿意,可以进群一起学习交流。2.实现依赖管理。当一个页面需要加载多个JS,其中一些JS存在依赖关系时,需要仔细安排好这些JS的顺序,保证每个组件都能正常运行,模块化之后就不用再操心了。3.提高可重用性和代码可读性。一个函数就是一个模块,各个模块相互独立,互不影响。代码组件包可以复用,去掉这个模块不会影响其他。JavaScript模块化开发闭包和命名空间这是最简单方便的解决方案。早在模块化概念提出之前,很多人就已经使用闭包来解决变量名重复和污染的问题。这样每个JS文件都被IIFE包裹起来,每个JS文件在不同的词法范围内相互隔离,最后通过闭包暴露变量。每个闭包都是一个单独的文件,每个文件仍然是通过script标签下载的,标签的顺序就是模块的依赖。这种面向对象开发的方法只是闭包方法的一个小改进。约束返回的js文件必须是对象,对象实际上是方法和属性的集合。这样的优点:1)标准化输出,更加统一,便于相互依赖和参考;2)使用“class”方式开发,方便后续依赖扩展。本质上,这个方法只是对闭包方法的规范约束,并没有做根本性的改变。YUIYahoo出品的一款工具。模块化管理只是其中的一部分。它还具有JS压缩、混淆、请求合并(合并资源需要服务端配合)等性能优化工具。可谓现存JS模块化的鼻祖。通过YUI全局对象来管理不同的模块,所有的模块只是对象上的不同属性,相当于操作系统上运行的不同程序。CommonJs于2009年由Nodejs发布,Commonjs发布后成为Node中标准的模块化管理工具。同时,Node还推出了npm包管理工具。npm平台上的包都符合Commonjs规范。随着Node和npm的发展,Commonjs的影响力也越来越大,推动了后续模块化工具的发展。它是一个里程碑式的模块化工具。AMD和RequireJSAMD是“AsynchronousModuleDefinition”的缩写,意思是“异步模块定义”。它异步加载模块,模块的加载不影响后面语句的运行。所有依赖此模块的语句都定义在一个回调函数中,回调函数将在所有依赖加载完成(前置依赖)后运行。RequireJs是一个JS模块化工具框架,是AMD规范的具体实现。不过有意思的是,在RequireJs诞生之后,在推广过程中产生了AMD规范。RequireJs的优点:1)动态并行加载js,依赖前端,无需考虑js加载顺序问题;2)核心是注入变量的沙箱编译,解决模块化问题;3)标准化输入输出,使用方便;4)适用于不符合AMD规范的文件。CMD和SeaJsCMD规范诞生于中国(阿里巴巴),借鉴了Commonjs规范和AMD规范,并在两者的基础上进行了改进。特点:1)define定义模块,requires加载模块,exports暴露变量;2)与AMD的前置依赖不同,CMD尊重依赖的邻近性(需要时重新加载);3)尊重api的单一功能,一个模块做一件事。SeaJs是CMD规范的实现。与RequireJs类似,CMD也是在SeaJs推广过程中诞生的规范。CMD吸取了AMD和Commonjs的诸多优点,SeaJs也对AMD和Commonjs做了很多兼容。ES6中的模块化ES6规范最终将模块化纳入了JavaScript标准。从此,JS模块化得到了官方的修正,也将成为未来JS的标准。ES6中的模块化不同于Commonjs,添加了关键字import、export、default、as、from,而不是全局对象。两者之间主要有两个区别:1)CommonJS模块输出一个值的副本,而ES6模块输出一个值的引用;2)CommonJS模块在运行时加载,ES6模块在编译时输出接口。
