1. 模块加载方案 commonJS 背景: 历史上,JavaScript 一直没有模块(module)体系, 无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来. 其他语言都有这项功能: Ruby 的require Python 的import 甚至就连 CSS 都有@import 但是 JavaScript 任何这方面的支持都没有,这对开发大型的.复杂的项目形成了巨大障碍 在 ES6 之前,社区制定了一些模块加载方案,最主要的有: CommonJS     用于服务器 AMD …
前言 主要学习一下四种模块加载规范: AMD CMD CommonJS ES6 模块 历史 前端模块化开发那点历史 require.js requirejs 为全局添加了 define 函数,你只要按照这种约定的方式书写这个模块即可. define(function () { //Do setup work here return { color: "black", size: "unisize" } }); //my/shirt.js now has some d…
运行和编译的概念 编译包括编译和链接两步. 编译,把源代码翻译成机器能识别的代码或者某个中间状态的语言. 比如java只有JVM识别的字节码,C#中只有CLR能识别的MSIL.还简单的作一些比如检查有没有粗心写错啥关键字了啊.有啥词法分析,语法分析之类的过程. 链接,是把编译生成的二进制文件,组合成为一个系统可以执行的可执行文件. 运行: 把编译出来的可执行文件代码在系统中执行的过程,此时被装载到内存中. (代码保存在磁盘上没装入内存之前是个死家伙.只有跑到内存中才变成活的). 运行时类型检查就…
他首先会遍历enableRegistry取出其中定义的模块,并且将没有加载成功的模块标识注入noLoads数组,如果过期了这里就会报错 如果上述没问题还会做循环依赖的判断,主要逻辑在breakCycle中,因为我们这里不存在循环依赖便跳出了,但还未结束 我们这里开始了递归检测依赖是否载入 if ((!expired || usingPathFallback) && stillLoading) { //Something is still waiting to load. Wait for…
在使用JavaScript开发大型项目时,模块开发概念是一个必须考虑的问题.其目的就是通过命名空间对各类业务对象进行一定的封装,防止命名冲突. 本篇着重介绍ES6 module中的export和import概念. 1. ES5的模块支持方案 在ES6之前,JavaScript本身没有模块支持,但社区创造了令人印象深刻的解决方案.两个最重要的(也是不相容的)标准是:AMD 和 CommonJS. 1.1 AMD 说明:AMD,全称为Asynchronous Module Definition,即异…
两种加载方式 加载方式 规范 命令 特点 运行时加载 CommonJS/AMD require 社区方案,提供了服务器/浏览器的模块加载方案 非语言层面的标准 只能在运行时确定模块的依赖关系及输入/输出的变量,无法进行静态优化. 编译时加载 ESMAScript6+ import 语言规格层面支持模块功能 支持编译时静态分析,便于JS引入宏和类型检验 动态绑定 export命令 定义 export命令用于规定模块的对外接口 输出变量 1.       单个输出 // profile.js exp…
最近工作需要,实现一个特定环境的模块加载方案,实现过程中有一些技术细节不解,便参考 了一些项目的api设计约定与实现,记录下来备忘. 本文不探讨为什么实现模块化,以及模块化相关的规范,直接考虑一些技术实现原理. 1.简单实现模块化 一开始我想如果我的代码只有一个文件,那几行不就实现了吗 main.js var modules = {} var define = function(id,factory){ moudles[id] = factory } var require = function…
一.前言 闭包是基于词法作用域(  和动态作用域对应,词法作用域是由你写代码时,将变量写在哪里来决定的,因此当词法分析器处理代码时,会保持作用)书写代码时所产生的自然结果,甚至不需要为了利用闭包而有意地创建闭包.闭包的创建和使用在动态语言的代码中随处可见.你缺少的只是识别,拥抱和使用闭包的思维. 当函数可以记住并访问所在的词法作用域,即使函数在当前词法作用域之外执行.就产生了闭包. 一般情况下,当函数执行完毕,垃圾回收机制会期待函数的整个内部作用域被销毁,但当闭包存在时,会阻止这件事情的发生,事…
在javascript是没有类似java或其他语言的模块概念的,因此也不可能通过import或using等关键字来引用模块,这样造成了复杂项目中前端代码混乱,变量互相影响等. 因此在复杂项目中引入AMD的概念,AMD:全称是Asynchronous Module Definition,即异步模块加载机制.通过AMD可以不需要在页面中手动添加<script>来引用脚本,而通过定义依赖自动加载模块脚本,接下来的代码将讲解如何实现建议的AMD模块,如果需要查看比较详细的实现可以下载requirejs…
看着java中各种import加载,在回过头来看看javascript还在自己造轮子,写各种XX的模块加载框架,ECMASCRIPT6不知什么时候能够普及.不过DT归DT,该学的还是要学. 一 同步加载模式(SMD) 同步顾名思义就是按顺序依次加载执行,比如A模块要引用B模块中的某些函数完成事情,那么此时B模块必须是已经存在页面内存中的,A调用顺利完成执行下面的操作.例子就是A模块直接调用document对象,因为document早已存在浏览器内存中. 同步模块代码实现也比较简单,解析模块路径,…