了解到的前端的一些概念
关于 JS 模块化
CommonJS 出现前
浏览器上 HTML、CSS、JS 之间的协作关系是,用户通过一个 URL 访问 HTML 文件,浏览器解析 HTML 文件,遇到其中的 CSS 文件、JS 文件相关的文件标签,就去下载对应的 CSS 文件、JS 文件,然后解析、执行。早期的 JS 并没有模块化的概念,所有的 JS 文件都是在一个全局的命名空间中定义变量、函数,因此很容易造成命名冲突,不同 JS 文件内同名变量、函数相互覆盖的情况,有一些约定俗成的规范来缓解这个问题,比如一个 JS 文件只定义一个全局对象,然后通过该全局对象作为访问入口,这样命名冲突的概率就大大减小了,但终究是治标不治本。
CommonJS 时代
在浏览器里因为引用的 JS 文件通常不会太多,所以没有模块化也能将就着,随着 NodeJS 项目的兴起,服务端也开始使用 JS,服务端的依赖通常比浏览器的 JS 文件依赖复杂得多,模块化势在必行。CommonJS 就是一个服务器模块化的规范,通过 require 函数运行时以同步的方式加载 JS 文件。
CommonJS 要求模块必须以 module.export 变量导出对外的变量或者函数,其他的变量或者函数(哪怕是全局的)都不会被导出;同时 CommonJS 还要求必须以 require 函数来导入模块,require 函数会把参数指向的 JS 文件放到一个匿名函数中执行 (function(){ module.exports={} /* 模块代码 */ return module.exports}()) 以此来保证不会污染其他全局变量,在执行完这段匿名函数代码后将返回值通过 require 函数返回即可。
CommonJS 是服务端(NodeJS)的模块化规范,由于其同步加载的方式,导致其并不适合放在浏览器运行(访问网络资源会造成卡顿),于是在浏览器端也出现了一些仿照 CommonJS 的项目,但是对其做了一定的优化,以适应浏览器环境,关键词大概是 AMD、RequireJS,目前对此没什么了解,暂时也不想了解。
ES6
ECMAScript 6(简称ES6)是于2015年6月正式发布的JavaScript语言的标准,正式名为ECMAScript 2015(ES2015)。它的目标是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言
ES6 在语言层面上引入了模块化支持。export 语句用于模块导出,import 语句用于模块的导入,在浏览器上使用 script 标签引用 ES6 语法的 JS 文件时,需要指定 type="module"。