Browserify 的介绍

browserify 是一个编译工具,是目前比较流行的模块打包工具之一(另外一个是webpack),browserify 是基于流式思想设计;可以通过命令行,也可以通过API来使用,是模块化的逆过程,但是推动模块化的快速发展,它可以使用类似于node的require()的方式来组织浏览器端的JavaScript代码,通过预编译可以让前端的JavaScript直接使用npm安装一些库

安装和简单的使用

全局安装:npm install -g browserify

使用:browserify main.js > compiled.js

​ 也就意味着main.js这个文件和依赖的的其他文件都会编译进compiled.js

编译好的文件的使用:

    <script src="./compiled.js"></script>

browserify 的工作原理

总体过程可以分为两个部分:预编译阶段和执行阶段

预编译阶段

1.从入口模块开始,分析代码中 require 函数的调用

2.生成AST

3.根据AST找到每个模块require的模块名

4.得到每个模块的依赖关系

5.包装每个模块,生成用于执行的

执行阶段

从入口模块开始执行,递归执行所有的require的模块,得到依赖对象

具体分析

由于浏览器原生是没有原生的require函数,所以require函数是需要自己实现的,因此第一步我们需要知道一个模块的代码中,哪些地方用了require函数,依赖了什么模块,browserify实现的原理是为了代码文件生成抽象语法树(AST,也称语法树,也就是语法分析的产物),根据AST,就可以找到require函数依赖的模块

举个例子,如下面的代码

var velement = require('./velement');
var diff = require('./diff');
var patches = diff(vdom, newVdom);

生成的抽象语法树的样子:查看这里

代码如下:

var diff = require('./diff');
var patches = diff(vdom, newVdom);

生成的语法树如下:网站

与之对应的JSON结构:网站

{"type": "Program","start": 0,"end": 245,"body": [{"type": "VariableDeclaration","start": 180,"end": 209,"declarations": [{"type": "VariableDeclarator","start": 184,"end": 208,"id": {"type": "Identifier","start": 184,"end": 188,"name": "diff"},"init": {"type": "CallExpression","start": 191,"end": 208,"callee": {"type": "Identifier","start": 191,"end": 198,"name": "require" },"arguments": [{"type": "Literal","start": 199,"end": 207,"value": "./diff","raw": "'./diff'" }]}}],"kind": "var"},{"type": "VariableDeclaration","start": 210,"end": 244,"declarations": [{"type": "VariableDeclarator","start": 214,"end": 243,"id": {"type": "Identifier","start": 214,"end": 221,"name": "patches"},"init": {"type": "CallExpression","start": 224,"end": 243,"callee": {"type": "Identifier","start": 224,"end": 228,"name": "diff" },"arguments": [{"type": "Identifier","start": 229,"end": 233,"name": "vdom" },{"type": "Identifier","start": 235,"end": 242,"name": "newVdom" }]}}],"kind": "var"}],"sourceType": "module"
}

在上面的结构中,也可以很轻易的看到使用require的地方,就在第一个init里面,由此也可以发现,它的type为callExpression,callee的name为require,arguments的value为引入的模块的名称,所以也就可以根据这些特点找到require的模块名,得到每个模块的依赖关系之后,生成一个依赖字典,这个字典记录了哪些模块,以及模块各自依赖的模块,通过依赖字典,就很容易得知代码中的依赖关系。

下面就需要代码执行了,也就是要实现浏览器并不支持的export和require,所以就需要对原有的模块进行包装,所以就需要实现export和require,export的实现,创建一个对象作为该模块的export,require的实现就要依赖之前的依赖字典,根据传入的模块名,在依赖字典里找到依赖的函数模块,然后一直执行(递归执行)

在browserify生成的JavaScript文件当中,会添加以下require的实现代码,并传递给每个模块函数

(function e(t,n,r){   //t是传入的依赖字典,n是一个空对象,用于保存所有新创建的模块(exports对象)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
})

browserify的介绍相关推荐

  1. React with Webpack -1: 介绍Helloworld

    React with Webpack -1: 介绍&Helloworld node.js 开发之react 学习1 context:node.js 开发的工具和lib发展的很快,in othe ...

  2. 前端构建工具的用法—grunt、gulp、browserify、webpack

    随着前端项目的飞速发展,项目越来越大.文件越来越多,前端工程化的工具也越来越多.下面介绍目前最流行的四种构建工具--grunt.gulp.browserify.webpack 所有的构建工具都是基于N ...

  3. [转]vue全面介绍--全家桶、项目实例

    慢慢了解vue及其全家桶的过程 原文http://blog.csdn.net/zhenghao35791/article/details/67639415 简介 "简单却不失优雅,小巧而不乏 ...

  4. Gulp browserify livereload

    Gulp browserify livereload 之前在browserify那个博文中介绍了gulp + browserify 不过那个配置还不能满足日常需要 搬运 https://github. ...

  5. browserify使用手册

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

  6. gulp plugins 插件介绍

    原文:http://ju.outofmemory.cn/entry/103253 鸟窝 2014-11-28 3020 阅读 gulp Gulp是一个构建工具, 功能类似grunt, 以及Java生态 ...

  7. Amaple.js框架详细介绍

    Amaple · 体验优先的JavaScript单页框架 Amaple (点此查看Github仓库)是专为单页web应用而设计的基于页面模块化的JavaScript框架,它可使开发者快速开发单页web ...

  8. vue全面介绍--全家桶、项目实例

    简介 "简单却不失优雅,小巧而不乏大匠". 2016年最火的前端框架当属Vue.js了,很多使用过vue的程序员这样评价它,"vue.js兼具angular.js和rea ...

  9. Vue.js——60分钟browserify项目模板快速入门

    概述 在之前的一系列vue.js文章,我们都是用传统模式引用vue.js以及其他的js文件的,这在开发时会产生一些问题. 首先,这限定了我们的开发模式是基于页面的,而不是基于组件的,组件的所有代码都直 ...

最新文章

  1. 小技巧: 从开始菜单进行网络搜索
  2. CCIE PASSED
  3. python批量生成,用python批量生成简单的xml文档
  4. 实时监测tcp链接状态_终于搞懂了 TCP 的 11 种状态,太不容易了…
  5. Direct2D教程(一)Direct2D已经来了,谁是GDI的终结者?
  6. html手机pc不同页面,PC端和手机端如何同时生成静态页
  7. 睡袋放置_第一次露营要带上什么?帐篷、睡袋怎么挑、怎么买?新手入门攻略...
  8. 在 Msys pacman安装vim后遇到的abcd与backspace问题..
  9. 两大微服务框架dubbo和spring cloud对比
  10. python 下载文件-python下载文件的三种方法
  11. android修改代码后运行不生效,Android Studio使用Kotlin时,修改代码后运行不生效问题...
  12. 如此轻松就能搭建聊天机器人,我也要弄一个~
  13. Windows打印服务器上无法删除打印机
  14. vue-property-decorator
  15. Spring Boot整合Redis-lesson8
  16. 爆:中国互联网的那些黑色产业链
  17. java在web里被禁用_JavaWEB_Session被禁用的后果和解决方法
  18. Python批量获取VOC测试集的类别
  19. 云服务器的购买及搭建
  20. java 路由框架_使用Spring框架和AOP实现动态路由

热门文章

  1. 浮点数的阶码怎么计算_每日一题| 计算机考研20200816
  2. 阿里巴巴CTO王坚的 “云和互联网观”
  3. 《MySQL技术内 幕 InnoDB存储引擎》读书笔记
  4. 算法高级(39)-坐电梯时情不自禁想起的电梯调度算法实现原理
  5. MBSE和SysML
  6. MATLAB中定义数组序列,matlab怎么定义一个数组
  7. IT技术面试官教你写面试简历
  8. 【Java成王之路】EE初阶第十四篇:(网络原理) 4
  9. 为什么成年人总是有抹不去的故乡情结?
  10. 网络推广营销方式有哪些