1。概述js早期的发展暴露了它的缺陷:缺乏模块,后来提出了commonJS规范来规范其模块的规范。作为一个JavaScript新手,我发现自己对JavaScript的模块机制不是很了解。查阅了一些资料,整理了一下JavaScriptCommonJS的原理和机制。2.JavaScript2.1无后端项目此类项目不能使用CommonJS模块规范。这是我一开始就犯的错误。在大多数浏览器不支持es6的情况下,js文件中充满了var和function,导致命名冲突和污染,使得JavaScript代码变得非常复杂。es6的类概念有效规范了JavaScript的模块化规范。由于这类项目只能通过script标签引入,这里就讲讲script标签的相关知识。每当浏览器解析标签特性的描述,我们知道在这个例子中,当浏览器解析以便点类可以在index.js中使用。总结一下:必须在header中导入js类库,以保证后面脚本导入的js文件的支持。毕竟script标签的执行顺序是顺序执行的,script标签的导入顺序和实际的导入顺序是一样的。自定义script标签导入的js文件要放在body的最后,保证DOM元素的渲染完成。每个js文件尽可能是一个es6类对象,避免作用域和命名域冲突。2.2后端服务器NodeJS模块参考示例如下:requiremethodconstmath=require("math");模块定义:上下文提供了一个导出对象,用于导出当前模块方法和变量,它是唯一的导出。在模块中,还有一个模块对象,代表模块本身,exports是模块对象的一个??属性。导出方法://math.jsexports.add=function(){};module.exports.add=function(){};2.3后端es6的moduleES6模块不是一个对象,而是通过export命令显式指定输出的代码,输入时也是静态命令的形式。由于ES6模块是在编译时加载的,因此可以进行静态分析。有了它,可以进一步拓宽JavaScript的语法,比如引入宏、类型系统等只能通过静态分析才能实现的功能。除了静态加载带来的各种好处之外,ES6模块还有以下好处:不再需要UMD模块格式,未来服务器和浏览器将支持ES6模块格式。目前通过各种工具库,实际上已经做到了这一点。以后浏览器新的API可以以模块的形式提供,不再需要做成全局变量或者navigator对象的属性。不再需要对象作为命名空间(例如Math对象),将来可以通过模块提供这些功能。在浏览器中使用ES6模块的语法如下:exportobjectsandvariables:variables.jsvarfirstName='XXX';varlastName='YYY';export{firstName,lastName};Point.js//exportclassobjectexportdefaultclassPointextendscircle{}引入moduleimportPointfrom"Point";加载机制详见:es6模块参考:高静:js的并行加载与顺序执行
