Javascript模块加载捆绑器Browserify Webpack和SystemJS用法

转自 http://www.jdon.com/idea/js/javascript-module-loaders.html

Javascript中模块加载器从最初小而简单的LABjs到RequireJS、Browserify、Webpack和SystemJS一直在演进发展。

LAB和curl等最初懒加载Javascript库包的方式虽然解决了浏览器加载大量不必要JS库包造成的堵塞问题,但是不利于维护。

Require.JS

Require是出现在2009年,它完全不同于之前的那些懒加载器,它将脚本标签写入到DOM中,监听完成的事件,然后递归加载依赖:

<script src="tools/require.js" data-main="myAppInit.js" ></script>

…或者如下调用指明的函数名称…

<script src="tools/require.js"></script>
<script>
require(['myAppInit', 'libs/jQuery'], function (myApp, $) { // ...
</script>

上面两个用法不建议同时使用。虽然Require存在各种特殊情况,但是其灵活性和强大性还是支持它成为浏览器端流行的加载器。

Browserify

Browserify允许CommonJS格式模块在前端使用,因此,它不只是一个模块加载器,而是模块捆绑器(bundler),是一个完整的代码构建段的工具,提供客户端能加载一堆代码的功能。

首先需要node和npm已经安装,获得包:

npm install -g –save-dev browserify

以CommonaJS格式编写你的模块即可。然后使用下面命令捆绑:

browserify entry-point.js -o bundle-name.js

它会递归以此发现entry-point中所有依赖包,然后将它们组装在一个单个文件中:

<script src="bundle-name.js"></script>

对于前端,你可以最小化合并核心代码,然后让可选模块在之后需要时加载,这样即节约了带宽也不影响模块编程功能实现。

Webpack

Webpack遵循Browserify的模块捆绑器路线,但是假如足够多功能来实现构建系统,不仅支持AMD还支持ES6格式,也支持CSS样式和HTML模板。

Webpack运行在一个称为“loaders”的概念上,这是一个插件注册用于处理文件类型,比如,一个loader能处理ES6 transpilation 或SCSS编译。

Loaders将数据喂给一个chunk,chunk开始于一个起点(类似于Browserify的捆绑器),一旦Webpack被设置好,只要配置产生变化,这些chunk会被自动重新产生,这就非常自动化强大。

关于热点模块替代问题,当运行webpack-dev-server,当你修改源码时,它能知道并修改浏览器中的代码,类似于其他源码监控器,它不需要浏览器重新载入或重启,这样就节约大量开发时间。

安装:

npm install -g –save-dev webpack

打包到一个起点文件:

webpack ./entry-point.js bundle-name.js

SystemJS

SystemJS可看成是ES6模块加载器Polyfill的浏览器接口,Polyfill不仅能在浏览器中使用,而且可以在Node环境通过NPM使用。

SystemJS实现类似于RequireJS:

<script src="system.js"></script>
<script>
// 设置我们的 baseURL 引用路径
System.config({baseURL: '/app'
});
// loads /app/main.js
System.import('main.js');
</script>

SystemJS是Angular.js 2.0的推荐加载器,它也支持非JS文件类型,使用systemjs-builder插件工具可以实现捆版和优化文件。

SystemJS 最强大的组件是JSPM,或称为Javascript包管理器,基于ES6模块加载器Polyfill和npm建立,JSPM能够使得isomorphic同构Javascript成为现实。

比较总表如下:

Loader category Loader module format Server filers Server module format Loader code
Tiny loaders vanilla JS 和本地文件一样 Same format as local files curl('entryPoint.js')
RequireJS AMD 改变且最小化 AMD requirejs('entryPoint.js',function(eP){/*startup code*/});
Browserify CommonJS 改变且最小化 CommonJS inside AMD wrapper <script src="browserifyBundle.js"></script>
Wabpack AMD and/or CommonJS (mixed OK) "Chunked" - Concat and minify into feature groups Webpack proprietary wrapper <script src="wabpackChunk.js"></script>
SystemJS vanilla, AMD, CommonJS, ES6 和本地文件一样 SystemJS proprietary wrapper System.import('entryPoint.js').then(function(eP){/*startup code*/});

JavaScript专题 http://www.jdon.com/js.html

Javascript模块加载捆绑器Browserify Webpack和SystemJS用法相关推荐

  1. javascript模块化、模块加载器初探

    最常见网站的javascript架构可能是这样的: 一个底层框架文件,如jQuery 一个网站业务框架文件,包含整站公用业务模块类(如弹框.ajax封装等) 多个业务文件,包含每个具体页面有关系的业务 ...

  2. javascript 异步模块加载 简易实现

    在javascript是没有类似java或其他语言的模块概念的,因此也不可能通过import或using等关键字来引用模块,这样造成了复杂项目中前端代码混乱,变量互相影响等. 因此在复杂项目中引入AM ...

  3. seajs引入html,SeaJS:一个适用于 Web 浏览器端的模块加载器

    什么是SeaJS? SeaJS是一款适用于Web浏览器端的模块加载器,它同时又与Node兼容.在SeaJS的世界里,一个文件就是一个模块,所有模块都遵循CMD(Common Module Defini ...

  4. ES6 系列之模块加载方案

    前言 本篇我们重点介绍以下四种模块加载规范: AMD CMD CommonJS ES6 模块 最后再延伸讲下 Babel 的编译和 webpack 的打包原理. require.js 在了解 AMD ...

  5. FreeSwitch 的初始化及其模块加载过程

    FS 主函数main() Freeswitch的主函数是在文件switch.c中定义的,该文件的260行是整个程序的入口,主函数主要完成的功能是包括,命令行解析,初始化apr库,构建全局内存池,模块加 ...

  6. 高性能javascript 文件加载阻塞

    高性能javascript javascript脚本执行过程中会中断页面加载,直到脚本执行完毕,此操作阻塞了页面加载,造成性能问题.   脚本位置和加载顺序: 如果将脚本放在head内,那么再脚本执行 ...

  7. 如何显示jQuery中的加载微调器?

    在原型中,我可以使用以下代码显示"正在加载..."图像: var myAjax = new Ajax.Request( url, {method: 'get', parameter ...

  8. 模块加载过程代码分析1

    一.概述 模块是作为ELF对象文件存放在文件系统中的,并通过执行insmod程序链接到内核中.对于每个模块,系统都要分配一个包含以下数据结构的内存区. 一个module对象,表示模块名的一个以null ...

  9. 未能加载文件或程序集rsy3_abp vnext2.0之核心组件模块加载系统源码解析

    abp vnext是abp官方在abp的基础之上构建的微服务架构,说实话,看完核心组件源码的时候,很兴奋,整个框架将组件化的细想运用的很好,真的超级解耦.老版整个框架依赖Castle的问题,vnext ...

最新文章

  1. 数位dp 的简单入门
  2. 【Android 逆向】ART 脱壳 ( DexClassLoader 脱壳 | oat_file_assistant.cc 中涉及的 oat 文件生成流程 )
  3. python多线程的两种写法
  4. 初识Anrdiod SDK
  5. 西瓜书+实战+吴恩达机器学习(七)监督学习之决策树 Decision Tree
  6. 验证码 随机生成器 详解
  7. 超强合集:OCR文本检测干货汇总(含论文、源码、demo等资源)
  8. 企业微信api接口,企业微信sdk
  9. 【财政决策支持系统DSS】财政支出OLAP分析模型参考【财政数据仓库DW】
  10. 计算机二级office试题构成,2016年计算机二级office题库及答案
  11. 简单MFC ActiveX插件例子
  12. stylus 设置全局样式_vue 公共样式处理_全局styl文件
  13. 哈佛结构和冯诺伊曼结构
  14. auto.ja 部落冲突01 找图并点击
  15. maptalks:数据归一化处理与分层设色图层加载
  16. 使用Pyqt5制作IT7321仪器测试软件
  17. Windows下如何快速查看并导出系统详细信息(计算机名、操作系统、系统制造商、系统型号、BIOS、CPU及内存大小)
  18. matlab谐波含量,基于谐波检测中的数字低通滤波器的MATLAB设计
  19. 赛维时代IPO过会:第一季净利降71% 出口跨境电商热度降温
  20. C语言时间库操作-->协调时转本地时

热门文章

  1. python超简单超基础的免费小说爬虫
  2. 【转】MATLAB各种矩阵生成函数
  3. Arch Linux下的外接显示器
  4. 拯救消防员!AI提前30秒预测火灾闪燃;12个Python项目的全流程:从构思、执行到部署;『系统设计』面试资料大全;高性能图数据处理和嵌入的Rust/Python库 | ShowMeAI资讯日报
  5. 换硬币的c语言程序流程图,C语言换分币问题
  6. 护卫神主机大师Linux添加绑定ssl证书
  7. 微信H5资源预加载(图片、字体)
  8. big java 中文版_Big Faceless Java PDF Library
  9. 三行代码解决全部网页木马
  10. android的50个优秀的UI界面设计例子