使用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 相关文章推荐
javascript for循环设法提高性能
Feb 24 Javascript
js实现跨域的方法实例详解
Jun 24 Javascript
如何高效率去掉js数组中的重复项
Apr 12 Javascript
Bootstrap每天必学之折叠(Collapse)插件
Apr 25 Javascript
快速实现JS图片懒加载(可视区域加载)示例代码
Jan 04 Javascript
微信小程序去哪里找 小程序到底如何使用(附小程序名单)
Jan 09 Javascript
jquery实现折叠菜单效果【推荐】
Mar 08 Javascript
关于Bootstrap按钮组件消除黄框的方法
May 19 Javascript
什么是Vue.js框架 为什么选择它?
Oct 17 Javascript
js实现GIF动图分解成多帧图片上传
Oct 24 Javascript
vue 封装面包屑组件教程
Nov 16 Javascript
微信小程序实现锚点跳转
Nov 23 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
简单的php文件上传(实例)
2013/10/27 PHP
Php无限级栏目分类读取的实现代码
2014/02/19 PHP
Windows Server 2008 R2和2012中PHP连接MySQL过慢的解决方法
2016/07/02 PHP
通过JAVASCRIPT读取ASP设定的COOKIE
2007/02/15 Javascript
js indexOf()定义和用法
2012/10/21 Javascript
javascript的原生方法获取数组中的最大(最小)值
2012/12/19 Javascript
javascript完美拖拽的实现方法
2013/09/29 Javascript
纯JS实现根据CSS的class选择DOM
2014/03/22 Javascript
JavaScript中原型和原型链详解
2015/02/11 Javascript
使用纯javascript实现经典扫雷游戏
2015/04/23 Javascript
js实现一个可以兼容PC端和移动端的div拖动效果实例
2016/12/09 Javascript
使用 vue.js 构建大型单页应用
2018/02/10 Javascript
使用puppeteer破解极验的滑动验证码
2018/02/24 Javascript
vue的全局变量和全局拦截请求器的示例代码
2018/09/13 Javascript
python在windows下实现备份程序实例
2014/07/04 Python
Python实现的文本编辑器功能示例
2017/06/30 Python
django将图片上传数据库后在前端显式的方法
2018/05/25 Python
从训练好的tensorflow模型中打印训练变量实例
2020/01/20 Python
windows python3安装Jupyter Notebooks教程
2020/04/13 Python
python--shutil移动文件到另一个路径的操作
2020/07/13 Python
Matlab中plot基本用法的具体使用
2020/07/17 Python
利用django创建一个简易的博客网站的示例
2020/09/29 Python
浅谈anaconda python 版本对应关系
2020/10/07 Python
New Balance英国官方网站:始于1906年,百年慢跑品牌
2016/12/07 全球购物
SmartBuyGlasses美国官网:太阳眼镜和眼镜
2017/08/20 全球购物
中队活动总结
2014/08/27 职场文书
出国签证在职证明
2014/09/20 职场文书
我的大学四年规划书范文2014
2014/09/26 职场文书
研究生论文答辩开场白
2015/05/27 职场文书
红色影片观后感
2015/06/18 职场文书
2016春季幼儿园大班开学寄语
2015/12/03 职场文书
幼儿园教师暑期培训心得体会
2016/01/09 职场文书
用Python将库打包发布到pypi
2021/04/13 Python
Python用tkinter实现自定义记事本的方法详解
2022/03/31 Python
《进击的巨人》新联动CM 兵长强势出击兽巨人
2022/04/05 日漫
HTML 里 img 元素的 src 和 srcset 属性的区别详解
2023/05/21 HTML / CSS