文章 评论 浏览 28
1、CommonJSCommonJS 规范概述了同步声明依赖的模块定义。这个规范主要用于在服务器端实现模块化代码组 织,但也可用于定义在浏览器中使用的模块依赖。CommonJS 模块语法不能在浏览器中直接运行。CommonJS 模块定义需要使用 require()指定依赖,而使用 exports 对象定义自己的公共 API。如下例:无论一个模块在 require()中被引用多少次,模块永远是单例。模块第一次加载后会被缓存,后续加载会取得缓存的模块。如下例,moduleA只会被打印一次,这是因为无论请求多少次,ModuleA只会被加载一次。module.exports 对象非常灵活,有多种使用方式。如下例:只导出一个实体,也可以到处多个对象。
2、异步模块定义(AMD):由于CommonJS以服务器端为目标环境,能够一次性把所有模块都加载到内存,而异步模块定义(AMD)的模块定义系统则以浏览器为目标执行环境,这需要考虑网络延迟的问题。AMD的一般策略:让模块声明自己的依赖,而运行在浏览器中的模块系统会按需获取依赖,并在依赖加载完成后立即执行依赖它们的模块。AMD模块实现的核心是用函数包装模块定义:这样可以防止声明全局变量,并允许加载器库控制何时加载模块。与CommonJS不同,AMD支持可选的为模块指定字符串标识符。例子:AMD 也支持 require 和 exports 对象,通过它们可以在 AMD 模块工厂函数内部定义 CommonJS风格的模块。这样可以像请求模块一样请求它们,但 AMD 加载器会将它们识别为原生 AMD 结构
3、通用模块定义UMD:为了统一CommonJS和AMD生态系统,通用模块定义(UMD,Universal Module Definition)规范应运而生。UMD可用于创建这两个系统都可以使用的模块代码。本质上:UMD定义的模块会在启动时检测要使用哪个模块系统,然后进行适当配置,并把所有逻辑包装在一个立即调用的函数表达式(IIFE)中。此模式有支持严格 CommonJS 和浏览器全局上下文的变体。不应该期望手写这个包装函数,它应该由构建工具自动生成。开发者只需专注于模块的内由容,而不必关心这些样板代码。
4、使用ES6模块:ES6 最大的一个改进就是引入了模块规范。这个规范全方位简化了之前出现的模块加载器,原生浏览器支持意味着加载器及其他预处理都不再必要。从很多方面看,ES6 模块系统是集 AMD 和 CommonJS之大成者。ECMAScript 6 模块是作为一整块 JavaScript 代码而存在的。带有 type="module"属性的<script> 标签会告诉浏览器相关代码应该作为模块执行,而不是作为传统的脚本执行。模块可以嵌入在网页中, 也可以作为外部文件引入:嵌入的模块定义代码不能使用 import 加载到其他模块。只有通过外部文件加载的模块才可以使用import 加载。因此,嵌入模块只适合作为入口模块。
https不存在中间人攻击。除非你自己忽略浏览器的不安全提醒,或者自己http client禁用证书校验。但是这都是使用者的错,和https没有关系。
output[idx++] = value[j++];这种出来的数组下标是不规律的,为啥不直接用push
文章 0 评论 0
接受
1、CommonJS




CommonJS 规范概述了同步声明依赖的模块定义。这个规范主要用于在服务器端实现模块化代码组 织,但也可用于定义在浏览器中使用的模块依赖。CommonJS 模块语法不能在浏览器中直接运行。
CommonJS 模块定义需要使用 require()指定依赖,而使用 exports 对象定义自己的公共 API。如下例:
无论一个模块在 require()中被引用多少次,模块永远是单例。模块第一次加载后会被缓存,后续加载会取得缓存的模块。
如下例,moduleA只会被打印一次,这是因为无论请求多少次,ModuleA只会被加载一次。
module.exports 对象非常灵活,有多种使用方式。如下例:
只导出一个实体,也可以到处多个对象。
2、异步模块定义(AMD):由于CommonJS以服务器端为目标环境,能够一次性把所有模块都加载到内存,而异步模块定义(AMD)的模块定义系统则以浏览器为目标执行环境,这需要考虑网络延迟的问题。


AMD的一般策略:让模块声明自己的依赖,而运行在浏览器中的模块系统会按需获取依赖,并在依赖加载完成后立即执行依赖它们的模块。
AMD模块实现的核心是用函数包装模块定义:这样可以防止声明全局变量,并允许加载器库控制何时加载模块。
与CommonJS不同,AMD支持可选的为模块指定字符串标识符。
例子:
AMD 也支持 require 和 exports 对象,通过它们可以在 AMD 模块工厂函数内部定义 CommonJS
风格的模块。这样可以像请求模块一样请求它们,但 AMD 加载器会将它们识别为原生 AMD 结构
3、通用模块定义UMD:为了统一CommonJS和AMD生态系统,通用模块定义(UMD,Universal Module Definition)规范应运而生。UMD可用于创建这两个系统都可以使用的模块代码。

本质上:UMD定义的模块会在启动时检测要使用哪个模块系统,然后进行适当配置,并把所有逻辑包装在一个立即调用的函数表达式(IIFE)中。
此模式有支持严格 CommonJS 和浏览器全局上下文的变体。不应该期望手写这个包装函数,它应该
由构建工具自动生成。开发者只需专注于模块的内由容,而不必关心这些样板代码。
4、使用ES6模块:ES6 最大的一个改进就是引入了模块规范。这个规范全方位简化了之前出现的模块加载器,原生浏


览器支持意味着加载器及其他预处理都不再必要。从很多方面看,ES6 模块系统是集 AMD 和 CommonJS
之大成者。
ECMAScript 6 模块是作为一整块 JavaScript 代码而存在的。带有 type="module"属性的<script> 标签会告诉浏览器相关代码应该作为模块执行,而不是作为传统的脚本执行。模块可以嵌入在网页中, 也可以作为外部文件引入:
嵌入的模块定义代码不能使用 import 加载到其他模块。只有通过外部文件加载的模块才可以使用import 加载。因此,嵌入模块只适合作为入口模块。
第 26 题:介绍模块化发展历程