browserify总结
一。browserify 简介
browserify is a tool for compiling node-flavored commonjs modules for the browser。
You can use browserify to organize your code and use third-party libraries even if you don't use node itself in any other capacity except for bundling and installing packages with npm.
The module system that browserify uses is the same as node, so packages published to npm that were originally intended for use in node but not browsers will work just fine in the browser too.
官网链接
简介就直接从官网上copy过来,重点信息都加粗了。
二。学习总结
browserify 可以使开发前端组件就像开发node后端一样----使用require引入依赖(无缝使用了node模块系统的优点),甚至可以使用node里面才有的东西(比如Buffer对象,events,crypto等)。然后最终将编写的模块编译成一个js文件。
我的观点
对于模块化
browserify在他的handbook里面论述了前端模块系统(window globals,concatenate,AMD)的优缺点. 其中对挂载在window对象上这种方式的批判理由是:
Instead of a module system, each file defines properties on the window global object or develops an internal namespacing scheme.
This approach does not scale well without extreme diligence since each new file needs an additional tag in all of the html pages where the application will be rendered. Further, the files tend to be very order-sensitive because some files need to be included before other files the expect globals to already be present in the environment.
It can be difficult to refactor or maintain applications built this way.This approach tends to be very slow since each tag initiates a new round-trip http request.
browserify相对于挂载到window对象的优势在于:他将js文件都编译成了一个,只有一个http请求,并且消除了因为加载顺序导致的依赖失败。
只有一个http请求是很容易办到的。只需将一个模块的所有js文件放到一个js文件里即可。开发的时候是多个文件,开发完之后使用gulp,uglify,minify之后按依赖顺序合并到一个文件里即可。这个方法就是browserify在他的handbook里说的concatenate,对于这个他的解释是难以维护,很难发现错误发生在哪里。对于这个的话,在开发阶段是多个文件分开独立开发的,只是最后使用gulp合并在一起,发现问题出现在哪里没有多难吧!!!
让我们来看一下他编译后的js代码结构:
(function e(t, n, r) { //浏览器端的模块加载函数
function s(o, u) {
if (!n[o]) {
if (!t[o]) {
var a = typeof require == "function" && require;
if (!u && a)
return a(o, !0);
if (i)
return i(o, !0);
var f = new Error("Cannot find module '" + o + "'");
throw f.code = "MODULE_NOT_FOUND",
f
}
var l = n[o] = {
exports : {}
};
t[o][0].call(l.exports, function (e) {
var n = t[o][1][e];
return s(n ? n : e)
}, l, l.exports, e, t, n, r)
}
return n[o].exports
}
var i = typeof require == "function" && require;
for (var o = 0; o < r.length; o++)
s(r[o]);
return s
})({
1 : [function (require, module, exports) {//传入的自定义模块
exports.say = function () {
console.log("Hello word");
}
}, {}
]
}, {}, [1]);
编译后的代码和直接使用闭包编写模块组件并没有太大不同,只不过这个引入了版本控制。模块自己有自己的依赖,如果模块的依赖中引入的俩个同名的模块的版本不同,那么就会俩个版本都引入,不会造成版本冲突(封装在各自的作用域下),只是文件会稍大,如果你能容忍,那没关系。
另外就是维护和重构,合并到一个文件里面确实难以维护。但是browserify最终也是将文件合并成了一个,开发的时候是多个。对于这个,按照上面我提到的方法,我们开发的时候也是各个小模块独立开发,最终聚合在一起。 这个方法的好处还有我们在开发的时候不需要编译即可进行各个模块间的联调,而browserify还需要编译一下。我们的编译只发生在最终的产品发布阶段。这个方法另外的优点browserify自己也提到:
On the plus side, all browsers natively support this approach and no server-side tooling is required.
对于使用node的模块
browserify可以使在浏览器端用node自带的或者本来是为node设计的第三方模块,比如events,Buffer,url等。对于这个特性我迫不及待地尝试了一下:
- w1.js
var events=require("events").EventEmitter;
var e=new events();
e.on("data",function(d){
document.getElementById("t1").innerHTML=d;
});
module.exports=e;
- w2.js
var crypto=require("crypto");
var md5update=function(str){
return crypto.createHash("md5").update(str).digest("hex");
};
exports.md5Update=md5update;
- tools.js
exports.eventer=require("./w1.js");
exports.md5=require("./w2.js").md5Update;
window.tools=exports;
- build.js
var browserify=require("browserify");
var fs=require("fs");
var ws=fs.createWriteStream("./final.js");
var b=browserify();
b.add("./tools.js");
b.bundle().pipe(ws);
- test.html
<!DOCTYPE html>
<html>
<head>
<style>
#t1{
width:200px;
height:100px;
background-color:skyblue;
margin-left:300px;
}
</style>
</head>
<body>
<div id="t1"></div>
<script type="text/javascript" src="./final.js"></script>
<script>
setInterval(function(){
var k='t'+Math.random();
tools.eventer.emit('data',tools.md5(k));
},5000)
</script>
</body>
</html>
然后:cmd>node build.js 编译出final.js 。使用浏览器打开test.html ,结果如预期:

可以看到md5加密后的字符串。
但是有一点令人无法接受,这个final.js 大小是549kb ,js.format之后是2w多行。 若非必要,还是不要用,d3的文件大小才300多kb,这才只用了crypto和events.....
final
我们可以选择性地使用browserify的功能,如果喜欢require()的方式的话,只要不嫌编译麻烦还是可以的。对于使用node本地的模块这一点,我们可以单独提出来,使用browserify做成对应项目的一个工具库。
browserify总结的更多相关文章
- Vue.js——60分钟browserify项目模板快速入门
概述 在之前的一系列vue.js文章,我们都是用传统模式引用vue.js以及其他的js文件的,这在开发时会产生一些问题. 首先,这限定了我们的开发模式是基于页面的,而不是基于组件的,组件的所有代码都直 ...
- 前端构建工具的用法—grunt、gulp、browserify、webpack
随着前端项目的飞速发展,项目越来越大.文件越来越多,前端工程化的工具也越来越多.下面介绍目前最流行的四种构建工具——grunt.gulp.browserify.webpack 所有的构建工具都是基于N ...
- gulp启动一个小型web服务器配置&browserify(require)
var gulp = require('gulp'), connect = require('gulp-connect'), // 运行live reload服务器 browserify = requ ...
- browserify压缩合并源码反编译
最近在学习钉钉(一个协作应用)桌面应用的前端源码时候,发现其js源码是用browserify做模块开发.于是想还原其源码的原本的目录结构,学习它的目录分类以及业务划分. 前言 用过browserify ...
- browserify学习总结
前言 在未接触browserify,虽然我知道它是一个前端构建工具,但还是有几个疑问: 1. browserify出现的日期? 2. 能构建哪些文件? 3. 附加的browserify代码体积是多大? ...
- gulp/grunt和browserify/webpack的区别
Gulp应该和Grunt比较,他们的区别我就不说了,说说用处吧.Gulp / Grunt 是一种工具,能够优化前端工作流程.比如自动刷新页面.combo.压缩css.js.编译less等等.简单来说, ...
- angular项目总结——angular + browserify + gulp + bower + less 架构分享
一眨眼,快三个月没有写博客了.一直在为自己没有写博客而懊恼,忙过这段时间,好好总结一下. 新项目主要是自己一个人在写,先搭建了一个初步的架构,用了我并不熟悉的angular,这个过程中,慢慢也熟悉了a ...
- browserify使用手册
简介 这篇文档用以说明如何使用browserify来构建模块化应用 browserify是一个编译工具,通过它可以在浏览器环境下像nodejs一样使用遵循commonjs规范的模块化编程. 你可以使用 ...
- 使用Gulp和Browserify来搭建React应用程序
对React有一定了解之后,我们知道,需要把JSX文件转换成JS文件,组件需要导入导出.本篇就体验使用Gulp把JSX文件转换成JS文件,使用Browserify来把组件捆绑到一个文件并理顺组件之间的 ...
- 使用Gulp和Browserify创建多个绑定文件
Browserify是一个Javascript的绑定工具,帮助我们理顺module之间的依赖关系.Gulp用来优化workflow.两者的共同点都是使用流,但在使用流方面也有不同之处: Browser ...
随机推荐
- [Angular 2] Inject Service with "Providers"
In this lesson, we’re going to take a look at how add a class to the providers property of a compone ...
- C++中创建对象的时候加括号和不加括号的区别
c++创建对象的语法有----- 1 在栈上创建 MyClass a; 2 在堆上创建加括号 MyClass *a= new MyClass(); 3 不加括号 MyClass *a = new My ...
- Javascript-显示系统时间
/*JS-显示系统时间*/function showLocale(objD) { var str, colorhead, colorfoot; var yy = objD.getYear( ...
- java_线程-锁
package com.demo.test3; import java.util.concurrent.CountDownLatch; /** * @author QQ: 1236897 * */ / ...
- C#_自动化测试 (四) 自动卸载软件
在平常的测试工作中,经常要安装软件,卸载软件, 即繁琐又累. 安装和卸载完全可以做成自动化. 安装软件我们可以通过自动化框架,自动点击Next,来自动安装. 卸载软件我们可以通过msiexec命 ...
- Wireshark抓包工具使用教程以及常用抓包规则
转载:http://fangxin.blog.51cto.com/1125131/735178 Wireshark是一个非常好用的抓包工具,当我们遇到一些和网络相关的问题时,可以通过这个工具进行分析, ...
- SMI接口,SMI帧结构,MDC/MDIO
转载:http://blog.csdn.net/zyboy2000/article/details/7442464 SMI全称是串行管理接口(Serial Management Interface). ...
- LeetCode 319
Bulb Switcher There are n bulbs that are initially off. You first turn on all the bulbs. Then, you t ...
- 文件加载---理解一个project的第一步
当我最开始写php的时候,总是担心这个问题:我在这儿new的一个class能加载到对应的类文件吗?毕竟一运行就报Fatal Error,什么**文件没找到,类无法实例化等等是一种很“低级”的错误,怕别 ...
- ActiveMQ(5.10.0) - hello world
Sending a JMS message public class MyMessageProducer { ... // 创建连接工厂实例 ConnectionFactory connFactory ...