为什么使用 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 模块化管理工具效率高?的更多相关文章

  1. 模块化管理工具兼打包工具 webpack

    webpack 是一个[模块化管理工具]兼[打包工具] 是一个工具(和seajs,requirejs管理前端模块的方式是不一样) 在webpack一个文件就是一个模块! seajs,requirejs ...

  2. Webpack:前端资源模块化管理和打包工具

    一.介绍: Webpack 是当下最热门的前端资源模块化管理和打包工具.它可以将许多松散的模块按照依赖和规则打包成符合生 产环境部署的前端资源.还可以将按需加载的模块进行代码分隔,等到实际需要的时候再 ...

  3. webpack模块化管理和打包工具

    Webpack简介 webpack是当下最热门的前端资源模块化管理和打包工具.它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源.还可以将按需加载的模块进行代码分隔,等到实际 需要的 ...

  4. MySQL高可用复制管理工具 —— Orchestrator使用

    背景 在上一篇「MySQL高可用复制管理工具 —— Orchestrator介绍」中大致介绍了Orchestrator的功能.配置和部署,当然最详细的说明可以查阅官方文档.本文开始对Orchestra ...

  5. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->WinForm版本新增新的角色授权管理界面效率更高、更规范

    角色授权管理模块主要是对角色的相应权限进行集中设置.在角色权限管理模块中,管理员可以添加或移除指定角色所包含的用户.可以分配或授予指定角色的模块(菜单)的访问权限.可以收回或分配指定角色的操作(功能) ...

  6. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->Web版本新增新的角色授权管理界面效率更高、更规范

    角色授权管理模块主要是对角色的相应权限进行集中设置.在角色权限管理模块中,管理员可以添加或移除指定角色所包含的用户.可以分配或授予指定角色的模块(菜单)的访问权限.可以收回或分配指定角色的操作(功能) ...

  7. MySQL高可用复制管理工具 —— Orchestrator介绍

    背景 在MySQL高可用架构中,目前使用比较多的是Percona的PXC,Galera以及MySQL 5.7之后的MGR等,其他的还有的MHA,今天介绍另一个比较好用的MySQL高可用复制管理工具:O ...

  8. (5.6)mysql高可用系列——MySQL Utilities 管理工具

    关键词:mysql工具集,mysql管理工具,mysql utilities [1]安装mysql utilities cd /download wget https://cdn.mysql.com/ ...

  9. 这么高颜值的Kubernetes管理工具Lens,难道还不能C位出道吗

    1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! Docker & Kubernetes相关文章:容器技术 一直使用官方的Kubernetes Dashboard来管 ...

随机推荐

  1. IP数据报格式 及路由转发算法

    ip数据报分首部和数据两部分组成: 首部分为固定部分和可变部分 版本--占 4 位,指 IP 协议的版本 目前的 IP 协议版本号为 4 (即 IPv4) 首部长度--占 4 位,可表示的最大数值 是 ...

  2. python实现多变量线性回归(Linear Regression with Multiple Variables)

    本文介绍如何使用python实现多变量线性回归,文章参考NG的视频和黄海广博士的笔记 现在对房价模型增加更多的特征,例如房间数楼层等,构成一个含有多个变量的模型,模型中的特征为( x1,x2,..., ...

  3. event.target的第一次

    今天在学习其他人代码的时候见到了event.target.nodeName,event.target.dataset.刚开始是一头雾水,便google一下.发现大多数给出的词条都是有关jQuery事件 ...

  4. Dijkstra算法的二叉堆优化

    Dijkstra算法的二叉堆优化 算法原理 每次扩展一个距离最小的点,再更新与其相邻的点的距离. 如何寻找距离最小的点 普通的Dijkstra算法的思路是直接For i: 1 to n 优化方案是建一 ...

  5. angular : ngModel 内部流程

    angular 1.5 beta link NgModelController provides API for the ngModel directive. The controller conta ...

  6. maven项目发布不成功的问题

    MyEclipes   里面有好多的项目,有些项目是插件有些是组件,  就是有些项目是被依赖的项目,有些事项目的主体,被依赖的项目需要打成jar 包放在maven的中央仓库里面,也是所说的maven的 ...

  7. 关于Storm tick

    关于Storm tick 1. tick的功能 Apache Storm中内置了一种定时机制——tick,它能够让任何bolt的所有task每隔一段时间(精确到秒级,用户可以自定义)收到一个来自__s ...

  8. Prince2学习有感:PRINCE2项目管理到底是什么?

      2007年1月份,我加入了荷兰Irdeto(中国)有限公司.刚进入公司,我就结识了Prince2(受控环境下的项目管理),才知道Prince2是英国政府在政府项目中使用的项目管理标准. 这个标准早 ...

  9. webots自学笔记(一)软件界面和简单模型仿真

    本人是某非理工类某高校大四狗,由于毕设研究需要使用webots软件,在学习使用webots的过程花费了很多时间.由于这个软件基本没有什么中文资料,所以想把自己所学到的一些东西写下来,如有什么错误的地方 ...

  10. 关于百度地图js api的getCurrentPosition定位不准确的解决方法

    很久之前帮大叔解决了一个gps坐标转换为百度地图坐标的问题.今天大叔又给我讲百度地图定位不准.我查了一下api,用了官方给出的这样一组函数. //创建查询对象 var geolocation = ne ...