browserify学习总结
前言
在未接触browserify,虽然我知道它是一个前端构建工具,但还是有几个疑问:
1. browserify出现的日期?
2. 能构建哪些文件?
3. 附加的browserify代码体积是多大?
4. 能生成多个输出文件吗?
5. 如何兼顾开发调试?
6. browserify vs webpack?
browserify
browserify可以让你使用类似于 node 的 require() 的方式来组织浏览器端的Javascript代码,通过预编译让前端Javascript可以直接使用 Node NPM 安装的一些库。
安装
npm install -g browserify
示例
module.js:
module.exports = 'It works from module.js.'
module2.js:
module.exports = 'It works from module2.js.'
这是 entry.js 的内容,像普通的 nodejs 程序那样使用 require() 加载库和文件:
entry.js:
var m = require('./module.js');
var m2 = require('./module2.js');
console.log(m, m2);
使用browserify编译:
$ browserify entry.js > bundle.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){
var m = require('./module');
var m2 = require('./module2');
console.log(m, m2);
},{"./module":2,"./module2":3}],2:[function(require,module,exports){
module.exports = 'It works from module.js.'
},{}],3:[function(require,module,exports){
module.exports = 'It works from module2.js.'
},{}]},{},[1]);
现在entry.js 需要的所有其它文件都会被编译进 bundle.js 中,包括很多层 require() 的情况也会一起被递归式的编译过来。
编译好的 js可以直接拿到浏览器使用
<script src="bundle.js"></script>
结合gulp
结合Gulp使用时,需要在工程里面添加package.json和安装一些node依赖。
示例:

gulpfile.js:
var gulp = require("gulp");
var browserify = require("browserify");
var sourcemaps = require("gulp-sourcemaps");
var source = require('vinyl-source-stream');
var buffer = require('vinyl-buffer');
gulp.task("browserify", function () {
var b = browserify({
entries: "./entry.js",
debug: true /*告知browserify在运行同时生成内联sourcemap用于调试*/
});
return b.bundle()
.pipe(source("bundle.js"))
.pipe(buffer())
.pipe(sourcemaps.init({loadMaps: true}))
.pipe(sourcemaps.write("."))
.pipe(gulp.dest("./dist"));
});
那就需要安装:
npm install gulp --save-dev
npm install gulp-sourcemaps --save-dev
npm install browserify --save-dev
npm install vinyl-source-stream --save-dev
npm install vinyl-buffer --save-dev
vinyl-source-stream:用于将browserify的bundle()的输出转换为gulp可用的vinyl(一种虚拟文件格式)流。
vinyl-buffer:用于将vinyl流转化为buffered vinyl文件(gulp-sourcemaps及大部分Gulp插件都需要这种格式)
编译运行:
gulp browserify

自问自答
1. browserify出现的日期?
在网上没有找到browserify开始出现的日期的说明,只是有Github上找到最初的版本是在2011/6/6。anywhere,这问题并不关键,也就不深究。
2. 能构建哪些文件?
如上面介绍,只能构建JavaScript文件。
3. 附加的browserify代码体积是多大?
文件合并后(编译后),browserify附加的代码的体积(不是业务代码)是不到1KB的。
4. 能生成多个输出文件吗?
严格上讲,单从命令使用,只能是一个输出文件。
5. 如何兼顾开发调试?
页面上运行时的js是编译后,所以要兼顾开发调试,那还是要用source map。
PS:不过必须部署到服务器才能看到source map文件。
browserify vs webpack
由于我用得不深,下面一些酌见:
1. 都是前端模块化的方案,都需要预编译。
2. browserify只干JavaScript,webpack啥都干(CSS、JavaScript、图片等)
3. browserify是轻量级的,webpack 整体解决、大而全的。
PS:webpack官网有对二者的使用方法进行对比:webpack for browserify users
总结
关于模块化的,无论是异步模块加载(AMD),还是browserify的预编译。关键不在于运行时是合并成一个文件,还是异步加载。关键是在于处理模块的依赖,使开发时候不需要关注模块之间的加载顺序、依赖关系,使用方式,只需关注自己当前模块的开发(不用管使用的模块在哪里,这模块又依赖了哪些模块)。
就类似于maven,提供了一个放置jar包,管理依赖关系,使得第三方库易于使用,最后也可做打包发布。
所以,无论是用RequireJS、SeaJS,还是grunt、gulp,或者browserify、webpack,最终都是为了模块开发,压缩合并只是一小部分。
附录:
示例代码:https://github.com/codingforme/code-learn/tree/master/browserify
参考文献
1. browserify【百度百科】
2. https://www.zhihu.com/question/37020798 【知乎】
本文为原创文章,转载请保留原出处,方便溯源,如有错误地方,谢谢指正。
本文地址 :http://www.cnblogs.com/lovesong/p/5861932.html
browserify学习总结的更多相关文章
- gulp进阶构建项目由浅入深
gulp进阶构建项目由浅入深 阅读目录 gulp基本安装和使用 gulp API介绍 Gulp.src(globs[,options]) gulp.dest(path[,options]) gulp. ...
- 前端模块化开发学习之gulp&browserify篇
随着web应用的发展,前端的比重占得越来越多,编写代码从而也越来越复杂.而通常我们需要将不同功能或者不同模块的代码分开写,最后在html中一起加载,这样做是可以的,但是当你需要进行维护或者是二次开发 ...
- browserify压缩合并源码反编译
最近在学习钉钉(一个协作应用)桌面应用的前端源码时候,发现其js源码是用browserify做模块开发.于是想还原其源码的原本的目录结构,学习它的目录分类以及业务划分. 前言 用过browserify ...
- Techparty-广州Javascript技术专场(学习分享)
上周末(2016/07/31)去了一个技术沙龙学习前端相关的东西,下面是各个主题我印象比较深的. React + Redux 最佳实践 主题:本次分享,主要从React/Redux相关概念及其工具链, ...
- React学习系列一
系列学习react 翻译地址 https://scotch.io/tutorials/learning-react-getting-started-and-concepts 我是初学者,英语也不是很好 ...
- Node.JS 学习路线图
转载自:http://www.admin10000.com/document/4624.html 从零开始nodejs系列文章, 将介绍如何利Javascript做为服务端脚本,通过Nodejs框架w ...
- Nodejs学习路线图
前言 用Nodejs已经1年有余,陆陆续续写了48篇关于Nodejs的博客文章,用过的包有上百个.和所有人一样,我也从Web开发开始,然后到包管 理,再到应用系统的开发,最后开源自己的Nodejs项目 ...
- node.js学习之路
(非原创) 目录 Nodejs的介绍 15个Nodejs应用场景 Nodejs学习路线图 1. Nodejs的介绍 Node.js的是建立在Chrome的JavaScript的运行时,可方便地构建快速 ...
- browserify使用手册
简介 这篇文档用以说明如何使用browserify来构建模块化应用 browserify是一个编译工具,通过它可以在浏览器环境下像nodejs一样使用遵循commonjs规范的模块化编程. 你可以使用 ...
随机推荐
- NotSupportedException-无法将类型“System.DateTime”强制转换为类型“System.Object”
几张图就可以说明一切 2015-03-29 21:54:09,206 [77] ERROR log - System.NotSupportedException: 无法将类型“System.DateT ...
- Entity Framework Code First实体关联数据加载
在项目过程中,两个实体数据之间在往往并非完全独立的,而是存在一定的关联关系,如一对一.一对多及多对多等关联.存在关联关系的实体,经常根据一个实体的实例来查询获取与之关联的另外实体的实例. Entity ...
- 实战MEF(1):一种不错的扩展方式
在过去,我们完成一套应用程序后,如果后面对其功能进行了扩展或修整,往往需要重新编译代码生成新的应用程序,然后再覆盖原来的程序.这样的扩展方式对于较小的或者不经常扩展和更新的应用程序来说是可以接受的,而 ...
- OPEN CASCADE Gauss Least Square
OPEN CASCADE Gauss Least Square eryar@163.com Abstract. The least square can be used to solve a set ...
- ng1和ng2的部分对比----angular2系列(四)
前言: angular2相比angular1做了革命性的改变.对于开发者来说,我们知道它框架的实现上改变极大.我们看到代码也能发现它写法上变化很大,似乎完全是另一个东西. 但是当我们真正去写下去的时候 ...
- 1Z0-053 争议题目解析330
1Z0-053 争议题目解析330 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 330.What will be the end result of this set of RM ...
- SQLite关系型数据库
SQLiteOpenHelper的使用: 首先声明一个DatabaseHelper类,这个类继承于SQLiteOpenHelper类,首先得有构造函数,声明DatabaseHelper类如 ...
- AngularJs之Scope作用域
前言: 上篇博文AngularJs之directive中说了Scope作用域是个大坑,所以拿出来作为重点总结! 什么是scope AngularJS 中,作用域是一个指向应用模型的对象,它是表达式的执 ...
- 网页开发中文本编辑器UEditor的使用
首先看一下效果图: 首先我们需要来认识下UEditor,它是由百度web前端研发部开发所见即所得富文本web编辑器,并且是基于BSD协议的开源产品,允许自由使用和修改,开源就意味着可以自己来定制这个编 ...
- 谈谈asp.net MVC中的AppendTrailingSlash以及LowercaseUrls ,你还记得吗?
asp.net MVC是一个具有极大扩展性的框架,可以在从Url请求开始直到最终的html的渲染之间进行扩展,所以要学好还是需要了解框架的运行原理,推荐Artech. 今天我们回忆的不是MVC中的fi ...