谈谈 external 模式的打包
模块化在前端日新月异的工程化工具的推动下已经摆脱了前端模块加载器(SeaJS、RequireJS)的束缚,现在通常的方案是使用 browserify 或 webpack 来将模块化的文件打包,然后直接在浏览器端使用。
但是通常的打包策略是将整个项目打包成一个文件 bundle.js,默认情况下 bundle.js 中囊括了所有的依赖,包括第三方的从 node_modules 中加载的文件,这会造成 bundle.js 非常臃肿,而且在生产环境中不能很好的利用静态资源的缓存策略。这些打包技术在国外非常火,生产环境提供一个 bundle.js 的做法在国外的网络环境下毫无压力,但是国内的网络环境和国外的没法比,为了下载的性能还是建议分开打包。
分开打包还有一个好处就是,目前的前端开发环境现在都流行使用监测文件的变化而使用 livereload 技术,这也意味着会存在实时动态打包的需求,分开打包对于实时打包的速度有质的影响,对于基本不会变化的第三方模块没有必要每次做实时动态打包的时候都包含进去。
browserify 和 webpack 提供了一种 external 的打包模式。external 的打包模式会将第三方的模块打包成一个独立的 js 文件,这样就能和项目本身的文件分开来。当然,这并不是打包成一个 UMD 模块。打包的这个模块不会提供全局命名空间,必须将该文件使用 script 标签的形式加载到页面中,项目文件如果要使用这个 external 模块,可以直接执行 require 来获取,是一种不需要模块加载器的模块分离的使用方式。
<script src="react"></script> <script src="react-dom"></script> <script src="react-router"></script> <script> const React from 'react'; const ReactDOM from 'react-dom'; const ReactRouter from 'react-router'; </script>
那么如何将 node_modules 中的第三方的模块打包成 external 模式的包呢?这里以 browserify 为例来做说明。
首先假定已经将模块使用 npm install 的方式安装到了项目中,使用下面的命令即可进行 external 模式的打包。
$ browserify -r react-router -x react > react-router.js
现在来说说上面命令的具体含义:
-r
是--require
的缩写,这里定义从哪里加载要打包的文件,可以是文件路径也可以是位于 node_modules 中的模块(提供的是模块名)。-x
是--external
的缩写,react-router 这个模块依赖了 react,在这里想将 react 也作为一个 external 模式的包来使用。>
是最后要生成的文件路径。
如果其它包在打包的时候依赖了 react-router,必须使用 --external
来指明 react-router 是一个 external 的包,这样在打包的时候就会忽略这个包并且在打好包后还能正常使用。上面的命令 -x react
就是基于此原因。
建议继续学习:
- 关于静态资源打包后的相对路径问题 (阅读:2622)
- perl打包的建议 (阅读:2539)
- 游戏资源的压缩、打包与补丁更新 (阅读:2425)
- JavaScript组件打包模式 (阅读:2182)
- 使用xctool自动打包,测试xcode项目 (阅读:1958)
- 移动互联网必备:各平台自助渠道打包手段公开 (阅读:1602)
- 好用的CSS模块化打包工具CSS-Combo (阅读:1292)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:雨夜带刀 来源: 雨夜带刀
- 标签: external 打包
- 发布时间:2016-04-20 13:15:30
- [55] Oracle MTS模式下 进程地址与会话信
- [54] IOS安全–浅谈关于IOS加固的几种方法
- [53] 如何拿下简短的域名
- [52] android 开发入门
- [52] Go Reflect 性能
- [51] 图书馆的世界纪录
- [49] 读书笔记-壹百度:百度十年千倍的29条法则
- [47] 【社会化设计】自我(self)部分――欢迎区
- [39] 程序员技术练级攻略
- [32] 视觉调整-设计师 vs. 逻辑