概述

最近在使用vue框架重构公司的一个微信端产品,要想发挥vue的强大功能,离不开browserify或者webpack这些构建工具,基于这些构建工具可以在vue开发中使用ES6语法,单文件组件等特性,我个人更倾向于使用browserify构建工具,使用browserify工具可以在浏览器平台上提供像在node平台一样的开发体验,下面几篇文章将介绍下browserify构建的详细用法。

安装

cd app;
//初始化项目
npm init
//安装browserify
npm install browserify --save-dev

基本用法

在package.json中的scripts属性中添加以下命令:

 "xxx"   : "browserify ./source/module.js -o ./dist/dist.js"
或者
"xxx"   : "browserify ./source/module.js > ./dist/dist.js"

在当前目录打开命令窗口:

npm run xxx

即可在dist目录下看到打包后的dist.js文件。
browserify 后面的第一个参数表示要打包的前端程序的入口,-o或者>表示打包后的输出文件。browserify会根据入口文件中的require或者import(ES6,需要安装babel)自动完成依赖分析,并将依赖文件打包为一个单文件。

下面是API的调用方式:

var Browserify = require("browserify");
var fs = require("fs");var b = new Browserify();
//入口文件
b.add("../source/module.js");
//打包输出
b.bundle().pipe(fs.createWriteStream("../dist/dist.js"));

将部分依赖文件打包为符合commonjs规范的模块,外部可以通过require调用其中暴露的api,输入结果仍为单文件

下面是测试代码,有三个模块(文件):modulea,moduleb,module,其中module依赖modulea和moduleb

modulea:

module.exports = {name:"moduleA",getName:function(){console.log(this.name);}
}

moduleb:

module.exports = {name:"moduleB",getName:function(){return this.name;}
}

module:

var moduleA = require("ma");
var moduleB = require("mb");moduleA.getName();

命令脚本:

browserify -r ./source/modulea.js:ma -r ./source/moduleb.js:mb  ./source/module.js > ./dist/bundle.js

新建index.html,源码如下:

<body><script type="text/javascript" src="./dist/bundle.js"></script><script type="text/javascript">var mb = require("mb");console.log(mb.getName()+"========");</script>
</body>

控制台打印如下:

上述过程也可以通过调用API编码实现,结果和上面是一样的:

var browserify = require("browserify");
var path = require("path");
var fs = require("fs");var sourcepath = path.resolve(__dirname,"../","source");
var dist = path.resolve(__dirname,"../","dist");var b = browserify();
b.add(path.join(sourcepath,"module.js"));
b.require(path.join(sourcepath,"modulea.js"),{expose:"ma"});
b.require(path.join(sourcepath,"moduleb.js"),{expose:"mb"});
b.bundle().pipe(fs.createWriteStream(path.join(dist,"bundle.js")));

将依赖模块独立打包,最终输出多个文件,模块间可以通过require调用

有些场景下,比如有多个页面,每个页面都需要依赖common.js,这个时候将每个页面的js打包为一个文件就不合适,commonjs的代码会重复出现在多个文件中,而且也不利于缓存优化。

browserify提供了三种方式支持多JS文件:

  1. -i(–ignore),将依赖的文件以{}空对象替代,这个命令看起来没什么用处啊,依赖一个空的对象,不能提供任何属性和方法,暂时没发现这个命令的使用场景。
  2. -u(–exclude),忽略依赖的对象,该依赖对象不会被打包,依赖的对象可以是第三方的或者是通过-r命令生成的另外一个bundle文件,可以通过-u命令指定一些第三方类库,比如vue的类库。
  3. -x(external),-x指向的文件是通过-r命令生成的另外一个文件,该文件不会被打包。

第一种方式目前不知道有什么用处,第三种方式打包的时候,我在win10平台上打包的文件路径有问题,需要对引用路径特别注意,尤其是调用API打包的时候。因此我推荐使用第二种打包方式。

举例:有两个文件base.js和demo2.js,其中base.js是基础类包,可能在多个页面中都需要,现在将base.js和demo2.js分别打包:

base.js:

module.exports = {name:"base",getName:function(){return this.name;}
}

demo2.js:

var com = require("common");
console.log(com.getName());

打包脚本:

browserify -r ./source/base.js:common > ./dist/common.js
browserify -u common ./source/demo2.js > ./dist/bundle.js

index.html源码如下:

<script type="text/javascript" src="./dist/common.js"></script><script type="text/javascript" src="./dist/bundle.js"></script><script type="text/javascript">var com = require("common");console.log(com.getName());</script>

控制台输出如下:

调用API打包源码如下:

var browserify = require("browserify");
var path = require("path");
var fs = require("fs");var b = new browserify();
b.require(path.resolve(__dirname,"../source/base.js"),{expose:"common"
});
b.bundle().pipe(fs.createWriteStream("../dist/common.js"));var b2 = new browserify();
b2.exclude("common");
b2.add("../source/demo2.js");
b2.bundle().pipe(fs.createWriteStream("../dist/bundle.js"));

使用browserify构建工具可以直接使用一些原来只有在node平台上才有的API

比如url,path,stream,buffer,process等等。

transform

browserify提供了非常方便的transform接口来扩展打包行为。一个基本的transform接口定义格式如下:

var through2 = require("through2");module.exports = function(file,opts){return through2(function(chunk,enc,next){//自定义transform逻辑});
}

定义完成后,可以通过-t命令指定该文件,将自定义行为应用到打包中,也可以通过package.json的配置文件来配置过滤器:

"browserify":{
"transform":["./customTransform.js"
]
}

许多知名的框架为了用户方便的使用browserify,都提供了现成的xxxify模块,比如babelify,vueify等。

browserify使用简介相关推荐

  1. 构建自己的npm包 简单实现

    NPM 使用介绍 NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从 ...

  2. vue.js 入门,简介

    vue的源代码下载--开发版本和生产版本 https://cn.vuejs.org/js/vue.js https://cn.vuejs.org/js/vue.min.js vue中文学习官网 htt ...

  3. ECMAScript 6学习总结(1)——ECMAScript 6入门简介

    ECMAScript 6简介 ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在2015年6月正式发布了.它的目标,是使得 JavaScript 语言可 ...

  4. browserify使用手册

    简介 这篇文档用以说明如何使用browserify来构建模块化应用 browserify是一个编译工具,通过它可以在浏览器环境下像nodejs一样使用遵循commonjs规范的模块化编程. 你可以使用 ...

  5. browserify使用

    一.简介 browserift是javascript编译工具,可以通过预编译方式,将后端的node模块加入javascript中,进而 可在前端浏览器上执行. 二.安装 1.安装nodejs和npm ...

  6. browserify总结

    (迁移至博客园) 一.browserify 简介 browserify is a tool for compiling node-flavored commonjs modules for the b ...

  7. 通过 Browserify 在浏览器中使用 NodeJS 模块

    NodeJS 把 JavaScript 的使用从浏览器端扩展到了服务器端,使得前端开发人员可以用熟悉的语言编写服务器端代码.这一变化使得 NodeJS 很快就流行起来.在 NodeJS 社区中有非常多 ...

  8. etcd 笔记(01)— etcd 简介、特点、应用场景、常用术语、分布式 CAP 理论、分布式原理

    1. etcd 简介 etcd 官网定义: A highly-available key value store for shared configuration and service discov ...

  9. Docker学习(一)-----Docker简介与安装

    一.Docker介绍 1.1什么是docker Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源 Docker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植 ...

最新文章

  1. 《图解CSS3:核心技术与案例实战》——1.1节什么是CSS3
  2. MySQL中数据库的操作
  3. matlab图像处理——分水岭法
  4. linux下编译libuv,linux下libuv库安装教程
  5. vue mysql webapp_基于Laravel+VueJS实战开发WebAPP
  6. 绿盟科技鸿蒙系统,华为 X 绿盟科技,打造“云原生安全新生态”
  7. php 判断wap,php判断是否wap手机客户端的方法详解
  8. python安卓自动化原理_appium---appium自动化原理
  9. 时至今日,百度无人车还好吗?
  10. java基础巩固笔记(5)-多线程之线程并发库
  11. bzoj 2464: 中山市选[2009]小明的游戏(BFS)
  12. Scala快速入门到精通 视频教程 百度云网盘下载地址
  13. Excel——从文本中提取数字
  14. 怎样保存html视频,网页上的视频怎么保存到电脑 网页视频保存到电脑的步骤教程...
  15. iPhone启动页尺寸
  16. 行业报告归档 2017.3.21
  17. windows 安装 IDES
  18. Android7.0(mtk)开放root权限,adb root和app root
  19. 消费互联网、产业互联网、工业互联网、能源互联网的关键区别是什么?智慧城市、智慧园区、智慧交通、智慧水务、智能电网、智慧工厂中都需要的关键技术是什么?
  20. Centos 7 Authorization failed. Make sure polkit agent is running or run the application as superuser

热门文章

  1. 给圈里的中学生们的话
  2. 用matlab求解传递矩阵,用传递矩阵及MATLAB求解船舶轴系振动
  3. Linux任务前后台切换
  4. 数据结构——栈的顺序存储结构
  5. 无意中发现的一个好设计:不浸水的香皂盒
  6. 部署nova控制节点与计算节点
  7. 利用Arduino Mega的Analog端口无法驱动L298N电机芯片的解释
  8. 影楼行业的除了ps修图外还有Lr。
  9. erlang OTP 通用服务器行为模式理解
  10. 空气净化器全国产化电子元件推荐方案