为什么使用 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. hadoop--安装1.2.1版本

    hadoop的安装分为三种方式,第一种单机安装,一般用于调试(其实一般都不用).第二种,伪分布式安装,一般程序员开发会使用这种方式.第三种,分布式安装,在实际环境中应用.今天在这里记下的是第二种,即伪 ...

  2. 如何写好 Git commit messages

    导语:任何软件项目都是一个协作项目,它至少需要2个开发人员参与,当原始的开发人员将项目开发几个星期或者几个月之后,项目步入正规.不过他们或者后续的开发人员仍然需要经常提交一些代码去修复bug或者实现新 ...

  3. 《C++ Primer》读书笔记—第一章 开始

    声明: 文中内容收集整理自<C++ Primer 中文版 (第5版)>,版权归原书所有. 学习一门程序设计语言最好的方法就是练习编程. 1.一个函数的定义包含四个部分:返回类型(retur ...

  4. centos安装docker容器

    centos安装docker容器 系统环境需求 docker要运行在centos7系统中,系统为64位机器上,内核最小版本在3.10以上 如果系统为centos6,后面有附带的安装方法 uname - ...

  5. 自定义checkbox/radio

    一. label标签 1. 概念: HTML <label>元素表示用户界面中项目的标题.它通常关联一个控件,或者是将控件放置在label元素内,或者是用作其属性.这样的控制称作label ...

  6. ABP学习笔记

      1. 用 Nhibernate:CountAsync 是定义在System.Data.Entity里的 var totalCount = await query.CountAsync(); 出现以 ...

  7. ASP.NET通用权限框架 权限管理系统源码jquery 精美UI源码

    软件技术开发,合作请联系QQ:858-048-581 开发工具 VS2010 .sql2005.2008等(在Sql server数据执行脚本即可)  VS2010 打开保证本地运行成功(数据库.源代 ...

  8. PDO预处理语句规避SQL注入攻击

    所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存 ...

  9. 用JavaScript实现图片剪切效果

    学会如何获取鼠标的坐标位置以及监听鼠标的按下.拖动.松开等动作事件,从而实现拖动鼠标来改变图片大小. 还可以学习css中的clip属性. 一.CSS实现图片不透明及裁剪效果. 图片剪切三层结构 1.第 ...

  10. .NET基础笔记(C#)

    闲着没事就把以前学习时的笔记拿出来整理了一下,个人感觉有点用,就想拿出来跟园友共享一下.有些基础性的内容比如基本概念.语法什么的就不发了. 内容:1.构造方法(函数) 2.继承   3.访问修饰符   ...