使用Browserify来实现CommonJS的浏览器加载方法


Posted in Javascript onMay 14, 2017

Nodejs的模块是基于CommonJS规范实现的,可不可以应用在浏览器环境中呢?

var math = require('math');
math.add(2, 3);

第二行math.add(2, 3),在第一行require('math')之后运行,因此必须等math.js加载完成。也就是说,如果加载时间很长,整个应用就会停在那里等。这对服务器端不是一个问题,因为所有的模块都存放在本地硬盘,可以同步加载完成,等待时间就是硬盘的读取时间。但是,对于浏览器,这却是一个大问题,因为模块都放在服务器端,等待时间取决于网速的快慢,可能要等很长时间,浏览器处于"假死"状态

而browserify这样的一个工具,可以把nodejs的模块编译成浏览器可用的模块,解决上面提到的问题。本文将详细介绍Browserify

实现

Browserify是目前最常用的CommonJS格式转换的工具

请看一个例子,b.js模块加载a.js模块

// a.js
var a = 100;
module.exports.a = a;

// b.js
var result = require('./a');
console.log(result.a);

index.html直接引用b.js会报错,提示require没有被定义

//index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
<script src="b.js"></script>  
</body>
</html>

使用Browserify来实现CommonJS的浏览器加载方法

这时,就要使用Browserify了

【安装】

使用下列命令安装browserify

npm install -g browserify

【转换】

使用下面的命令,就能将b.js转为浏览器可用的格式bb.js

$ browserify b.js > bb.js

查看bb.js,browserify将a.js和b.js这两个文件打包为bb.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 a = 100;
module.exports.a = a;
},{}],2:[function(require,module,exports){
var result = require('./a');
console.log(result.a);
},{"./a":1}]},{},[2]);

index.html引用bb.js,控制台显示100

//index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
<script src="bb.js"></script>  
</body>
</html>

使用Browserify来实现CommonJS的浏览器加载方法

原理

Browserify到底做了什么?安装一下browser-unpack,就能清楚原理了

$ npm install browser-unpack -g

然后,使用下列命令,将前面生成的bb.js解包

$ browser-unpack < bb.js

使用Browserify来实现CommonJS的浏览器加载方法

可以看到,browerify将所有模块放入一个数组,id属性是模块的编号,source属性是模块的源码,deps属性是模块的依赖

因为b.js里面加载了a.js,所以deps属性就指定./a对应1号模块。执行的时候,浏览器遇到require('./a')语句,就自动执行1号模块的source属性,并将执行后的module.exports属性值输出

browerify将a.js和b.js打包,并生成bb.js,browser-unpack将bb.js解包,是一个逆向的过程。但实际上,bb.js依然存在

以上这篇使用Browserify来实现CommonJS的浏览器加载方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js注意img图片的onerror事件的分析
Jan 01 Javascript
javascript (用setTimeout而非setInterval)
Dec 28 Javascript
javascript学习笔记(二) js一些基本概念
Jun 18 Javascript
Jquery submit()无法提交问题
Apr 21 Javascript
一个css与js结合的下拉菜单支持主流浏览器
Oct 08 Javascript
node.js中的console.assert方法使用说明
Dec 10 Javascript
[原创]javascript typeof id==='string'?document.getElementById(id):id解释
Nov 02 Javascript
Bootstrap基本插件学习笔记之Popover提示框(19)
Dec 08 Javascript
求js数组的最大值和最小值的四种方法
Mar 03 Javascript
Bootstrap按钮组实例详解
Jul 03 Javascript
JS实现弹出下载对话框及常见文件类型的下载
Jul 13 Javascript
JavaScript学习笔记之惰性函数示例详解
Aug 27 Javascript
js实现股票实时刷新数据案例
May 14 #Javascript
Ext JS 实现建议词模糊动态搜索功能
May 13 #Javascript
js,jq,css多方面实现简易下拉菜单功能
May 13 #Javascript
easyui combogrid实现本地模糊搜索过滤多列
May 13 #Javascript
web.js.字符串与正则表达式操作
May 13 #Javascript
JS实现动态给标签控件添加事件的方法示例
May 13 #Javascript
jQuery插件FusionCharts绘制的2D条状图效果【附demo源码】
May 13 #jQuery
You might like
地摊中国 - 珍藏老照片
2020/08/18 杂记
用PHP实现小写金额转换大写金额的代码(精确到分)
2012/01/10 PHP
用PHP编写和读取XML的几种方式
2013/01/12 PHP
php mb_substr()函数截取中文字符串应用示例
2014/07/29 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
PHP常用的类封装小结【4个工具类】
2019/06/28 PHP
一个无限级XML绑定跨框架菜单(For IE)
2007/01/27 Javascript
Jquery 最近浏览过的商品的功能实现代码
2010/05/14 Javascript
关于javascript中的typeof和instanceof介绍
2012/12/04 Javascript
用js调用迅雷下载代码的二种方法
2013/04/15 Javascript
JS实现随机化快速排序的实例代码
2013/08/01 Javascript
Javasipt:操作radio标签详解
2013/12/30 Javascript
JavaScript使用cookie记录临时访客信息的方法
2015/04/07 Javascript
JavaScript声明变量名的语法规则
2015/07/10 Javascript
javascript实现的登陆遮罩效果汇总
2015/11/09 Javascript
JavaScript中绑定事件的三种方式及去除绑定
2016/11/05 Javascript
three.js实现围绕某物体旋转
2017/01/25 Javascript
vue-cli入门之项目结构分析
2017/04/20 Javascript
深入理解react-router@4.0 使用和源码解析
2017/05/23 Javascript
基于 D3.js 绘制动态进度条的实例详解
2018/02/26 Javascript
Vue slot用法(小结)
2018/10/22 Javascript
Vue.js中 v-model 指令的修饰符详解
2018/12/03 Javascript
Python实现windows下模拟按键和鼠标点击的方法
2015/03/13 Python
Python用threading实现多线程详解
2017/02/03 Python
一个基于flask的web应用诞生 组织结构调整(7)
2017/04/11 Python
详解Python3中的迭代器和生成器及其区别
2018/10/09 Python
html5菜单折纸效果
2014/04/22 HTML / CSS
瑞典轮胎在线:Tirendo.se
2018/06/21 全球购物
Java面向对象面试题
2016/12/26 面试题
绩效工资分配方案
2014/01/18 职场文书
公务员党员评议表自我鉴定
2014/09/14 职场文书
实习单位证明范例
2014/11/17 职场文书
Jupyter Notebook 如何修改字体和大小以及更改字体样式
2021/06/03 Python
Python实现GIF动图以及视频卡通化详解
2021/12/06 Python
python对文档中元素删除,替换操作
2022/04/02 Python
Docker安装MySql8并远程访问的实现
2022/07/07 Servers