为什么使用 Containjs 模块化管理工具效率高?
为什么使用 Containjs 模块化管理工具效率高?
要说明这个首先得说明一下,Containjs 的模块加载原理。
- 第一步,首先使用异步加载(ajax)在 js 目录下的 app.js 入口模块(Containjs内部会默认加载 ('js/app.js'))
- 第二步,生产已经加载成功模块的上下文环境
- 第三步,查找该模块文件中是否有依赖其他模块,如果有则异步加载所依赖模块,加载成功后继续第二步,直到最基础模块(没有依赖其它模块的模块)
- 第四步,等待应用所依赖模块都加载完成,则默认调用 require('js/app.js') 运行入口模块
看了 Containjs 的加载流程,好像也没明白为什么效率高对吧?下面就让我慢慢道来~
其实,奥秘就在第二步生产模块上下文和 require 加载依赖模块中。
在 Containjs 中模块加载成功后,会调用模块函数的生产函数(production),其中有一段是下面这样
// 生产模块,但是未执行
modules[url] = {
........
context : function(require, exports, module){
eval( data )
}
.......
}
上面代码中的 context 就是模块执行时候的上下文环境,很明显它被包含在一个匿名函数中,其中注入了三个接口 require、exports、module,具体什么作用这边就不多解释,可以去看我上一篇博客《Containjs是什么》。
但是,只要有点经验的人就会说,不对啊这函数中调用了 eval(data) 这效率能高吗?(其中 data 就是使用异步加载过来的模块代码字符串)
首先,说一个场景,传统的模块引入都是异步生成 script 标签然后添加到文档流中去异步加载的,加载成功后浏览器会立即解释并执行。
而 Containjs 使用的是 ajax 异步加载,加载成功后传入模块生产函数进行生产,生产的时候使用 eval() 函数进行解释 data 代码。当模块全部加载完成后,会默认调用 require('js/app.js') 入口模块,后开始执行。并且执行过后,马上被缓存模块接口,之后无论调用几次都不会在执行本模块,直接返回缓存的继承。
很多人会说 eval 效率很低啊,为什么你说效率高?是这样的,以前说使用 eval 效率低的原因场景是这样,在一个常用函数中使用 eval 比如:
// 普通定义
function add(a,b){
return a + b;
}
// 使用eval
function add(a,b){
eval('return a+b');
}
在普通定义中,return a+b 语句只被解释器,解释一次。而使用 eval 中则是每一次调用都调用 eval 解释并执行 return a+b 所以效率低。
而 Containjs 模块 eval 解释执行只会一次,之后会被缓存。传统的 script 引入也是一样代码也是会被解释执行一次。只不过发生在加载成功后马上执行而已。所以你懂的
为什么使用 Containjs 模块化管理工具效率高?的更多相关文章
- 模块化管理工具兼打包工具 webpack
webpack 是一个[模块化管理工具]兼[打包工具] 是一个工具(和seajs,requirejs管理前端模块的方式是不一样) 在webpack一个文件就是一个模块! seajs,requirejs ...
- Webpack:前端资源模块化管理和打包工具
一.介绍: Webpack 是当下最热门的前端资源模块化管理和打包工具.它可以将许多松散的模块按照依赖和规则打包成符合生 产环境部署的前端资源.还可以将按需加载的模块进行代码分隔,等到实际需要的时候再 ...
- webpack模块化管理和打包工具
Webpack简介 webpack是当下最热门的前端资源模块化管理和打包工具.它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源.还可以将按需加载的模块进行代码分隔,等到实际 需要的 ...
- MySQL高可用复制管理工具 —— Orchestrator使用
背景 在上一篇「MySQL高可用复制管理工具 —— Orchestrator介绍」中大致介绍了Orchestrator的功能.配置和部署,当然最详细的说明可以查阅官方文档.本文开始对Orchestra ...
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->WinForm版本新增新的角色授权管理界面效率更高、更规范
角色授权管理模块主要是对角色的相应权限进行集中设置.在角色权限管理模块中,管理员可以添加或移除指定角色所包含的用户.可以分配或授予指定角色的模块(菜单)的访问权限.可以收回或分配指定角色的操作(功能) ...
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->Web版本新增新的角色授权管理界面效率更高、更规范
角色授权管理模块主要是对角色的相应权限进行集中设置.在角色权限管理模块中,管理员可以添加或移除指定角色所包含的用户.可以分配或授予指定角色的模块(菜单)的访问权限.可以收回或分配指定角色的操作(功能) ...
- MySQL高可用复制管理工具 —— Orchestrator介绍
背景 在MySQL高可用架构中,目前使用比较多的是Percona的PXC,Galera以及MySQL 5.7之后的MGR等,其他的还有的MHA,今天介绍另一个比较好用的MySQL高可用复制管理工具:O ...
- (5.6)mysql高可用系列——MySQL Utilities 管理工具
关键词:mysql工具集,mysql管理工具,mysql utilities [1]安装mysql utilities cd /download wget https://cdn.mysql.com/ ...
- 这么高颜值的Kubernetes管理工具Lens,难道还不能C位出道吗
1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! Docker & Kubernetes相关文章:容器技术 一直使用官方的Kubernetes Dashboard来管 ...
随机推荐
- 【译文】什么是Docker
What is Docker? By Tim Butler • 14 May 2015 • https://www.conetix.com.au/blog/what-is-docker Unless ...
- Python package install血泪史
[前言][絮絮叨叨篇]:说实话,不是第一次安装Python库了,但是貌似没有特别顺利的时候,可能还是遇到的困难不够多咯.配置环境真是个糟心的事儿,不过作为菜鸟,还是得磨练磨练,毕竟某人云:" ...
- 【Javaweb】笔面试题 ---(1)
Javaweb 面试题:理解才是最重要的,而不是原封不动的背下来 一.请简述doget和dopost它们的区别 1) get是从服务器上获取数据,post是向服务器传送数据. 2) 在客户端,Get方 ...
- 为 .NET Core 设计一个 3D 图形渲染库
原文地址:https://mellinoe.wordpress.com/2017/02/08/designing-a-3d-rendering-library-for-net-core/ 作者:ERI ...
- git合并别的分支某次提交或合并
合并别的分支某次提交 master分支上改了一个bug.提交到master分支.现在在dev分支上开发,需要把master分支上改的那个bug合过来.步骤是:先在master分支上查改那个bug的SH ...
- 使用jquery的load方法设计动态加载,并解决被加载页面JavaScript失效问题
一.问题分析 对于后台系统,相比大家都有所印象,知道其中的布局结构,如图: 在这种布局中我们需要将header,sidebar,footer分开,而且对于中间部分的content内容需要动态变化,即根 ...
- apk反编译方式
一.Apk反编译得到Java源代码 下载上述反编译工具包,打开apk2java目录下的dex2jar-0.0.9.9文件夹,内含apk反编译成java源码工具,以及源码查看工具. apk反编译工具de ...
- Java(基础)的类与变量
Java的类与成员变量 在我们学习编程语言中,需要灵活自用,那么怎么来灵活的将所有的函数属性来调用来实现完整的工程呢? 所以我们需要认识到类和变量的定义 1.类是什么? 类是抽象的概念,而对象就是类的 ...
- 自学html5要花多长时间
自学html5培训课程对于没有基础的那么就需要从头开始学,主要包括以下几方面 1. PC端网页制作基础,包括css,html 2. Javascript.jquery 主要是写一些动效 3. 学习UI ...
- Ichars制作数据统计图
数据统计图基本上每个网站的后台都要做,不仅要做还要的非常详细才行,这样才能全面的具体的了解网站数据.之前用的jfreechart没有iChartjs用着方便,也没有iChartjs的效果炫,所以果断弃 ...