1、项目本身业务代码的js文件依赖与外部的js三方库时,加载顺序必须js第三方库在前,或者说某个js文件依赖于另一个js文件,那么加载顺序必须有先后,否则就会出错,这样久而久之代码难以维护;
2、那么如果我们把所有代码放入一个js文件中,就会解决问题1,那么文件会太大,网络加载也会出现瓶颈随着项目的增大加载会出现白屏的时间越长,并且也会导致作用域的问题(很多全局变量都会挂在到window上,会严重污染window对象,造成window的臃肿),可读性差,可阅读性很差,代码也不好维护;
3、那么如何解决作用域的问题:最早是使用任务执行器:grunt和gulp来管理我们的资源(安全拼接和组合我们的js文件),原理:利用js的立即调用函数表达式,表达式内的变量会被隔离,外部不能访问,这样就不会污染外部环境;
4、如何解决js文件过大的问题呢:如引入的第三方库我们只需要其中一个方法,确引入了整个库,网路需要加载整个库,这样是非常不友好的;nodejs 使js的模块诞生了,nodejs可以运行js,node中的commonjs,引入require的机制(允许在当前文件中引入我们需要的模块,开箱即用);
5、但是浏览器是不支持commonjs的,那么浏览器中如何加载模块呢:在早期使用了 browserify和require(解决命名冲突和文件依赖的问题)这样的打包工具来让浏览器支持模块,require提供了一种规范(AMD);随着js的发展,es6中import导入模块,export和export default暴露模块;
对于es6模块化浏览器支持还不是很完整, 是否有一种方式,不仅能让我们随意编写模块并且还可以支持任何的模块格式,webpack(基于node)解决了此问题,不仅可以支持commonjs、esmodule,还可以支持静态资源的打包等功能;