使用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中判断控件是否存在
Aug 25 Javascript
基于jQuery的图片左右无缝滚动插件
May 23 Javascript
正负小数点后两位浮点数实现原理及代码
Sep 06 Javascript
Javascript中的几种URL编码方法比较
Jan 23 Javascript
Web前端框架bootstrap实战【第一次接触使用】
Dec 28 Javascript
jQuery EasyUI 为Combo,Combobox添加清除值功能的实例
Apr 13 jQuery
jQuery实现所有验证通过方可提交的表单验证
Nov 21 jQuery
vue 父组件中调用子组件函数的方法
Jun 06 Javascript
详解element-ui表格中勾选checkbox,高亮当前行
Sep 02 Javascript
layui数据表格跨行自动合并的例子
Sep 02 Javascript
react用Redux中央仓库实现一个todolist
Sep 29 Javascript
基于vue项目设置resolves.alias: '@'路径并适配webstorm
Dec 02 Vue.js
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
yii框架中的Url生产问题小结
2012/01/16 PHP
PHP abstract 抽象类定义与用法示例
2018/05/29 PHP
ExtJS实现文件下载的方法实例
2013/11/09 Javascript
JavaScript实现的in_array函数
2014/08/27 Javascript
jQuery实现的支持IE的html滑动条
2015/03/16 Javascript
jQuery简单实现图片预加载
2015/04/20 Javascript
nodeJs内存泄漏问题详解
2016/09/05 NodeJs
原生JS取代一些JQuery方法的简单实现
2016/09/20 Javascript
JavaScript中定义对象原型的两种使用方法
2016/12/15 Javascript
原生js实现商品放大镜效果
2017/01/12 Javascript
JS中cookie的使用及缺点讲解
2017/05/13 Javascript
Bootstrap输入框组件使用详解
2017/06/09 Javascript
ECMAscript 变量作用域总结概括
2017/08/18 Javascript
jQuery选择器之基本选择器用法实例分析
2019/02/19 jQuery
vue实现商品列表的添加删除实例讲解
2020/05/14 Javascript
解决Vue的文本编辑器 vue-quill-editor 小图标样式排布错乱问题
2020/08/03 Javascript
[05:10]2014DOTA2国际邀请赛 通往胜利之匙赛场探秘之旅
2014/07/18 DOTA
[01:43]深扒TI7聊天轮盘语音出处4
2017/05/11 DOTA
[44:30]完美世界DOTA2联赛PWL S2 GXR vs Magma 第一场 11.25
2020/11/26 DOTA
Python抓取Discuz!用户名脚本代码
2013/12/30 Python
python采集百度百科的方法
2015/06/05 Python
简单实现python爬虫功能
2015/12/31 Python
浅谈pandas中DataFrame关于显示值省略的解决方法
2018/04/08 Python
Python3爬虫爬取百姓网列表并保存为json功能示例【基于request、lxml和json模块】
2018/12/05 Python
Python企业编码生成系统之主程序模块设计详解
2019/07/26 Python
对pytorch中的梯度更新方法详解
2019/08/20 Python
Python笔记之facade模式
2019/11/20 Python
Python 面向对象静态方法、类方法、属性方法知识点小结
2020/03/09 Python
Python爬虫使用bs4方法实现数据解析
2020/08/25 Python
python实现计算图形面积
2021/02/22 Python
CSS实现聊天气泡效果
2020/04/26 HTML / CSS
Tomcat的缺省是多少,怎么修改
2014/04/09 面试题
关于毕业的广播稿
2014/01/10 职场文书
村委会贫困证明
2014/01/14 职场文书
演讲稿之我的初心我的成长
2019/08/12 职场文书
python的列表生成式,生成器和generator对象你了解吗
2022/03/16 Python