使用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 相关文章推荐
jquery获得option的值和对option进行操作
Dec 13 Javascript
JavaScript的strict模式与with关键字介绍
Feb 08 Javascript
在JS中解析HTML字符串示例代码
Apr 16 Javascript
2014 年最热门的21款JavaScript框架推荐
Dec 25 Javascript
Javascript动画的实现原理浅析
Mar 02 Javascript
js中常用的Tab切换效果(推荐)
Aug 30 Javascript
Knockout结合Bootstrap创建动态UI实现产品列表管理
Sep 14 Javascript
EL表达式截取字符串的函数说明
Sep 22 Javascript
灵活使用console让js调试更简单的方法步骤
Apr 23 Javascript
js获取对象,数组所有属性键值(key)和对应值(value)的方法示例
Jun 19 Javascript
JavaScript判断浏览器版本的方法
Nov 03 Javascript
VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法
Apr 17 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
apache rewrite_module模块使用教程
2008/01/10 PHP
基于PHP实现的事件机制实例分析
2015/06/18 PHP
使用PHP+MySql实现微信投票功能实例代码
2017/09/29 PHP
xmlHTTP实例
2006/10/24 Javascript
XRegExp 0.2: Now With Named Capture
2007/11/30 Javascript
跟着Jquery API学Jquery之一 选择器
2010/04/07 Javascript
JS实现支持Ajax验证的表单插件
2016/03/24 Javascript
js HTML5多图片上传及预览实例解析(不含前端的文件分割)
2016/08/26 Javascript
JavaScript reduce和reduceRight详解
2016/10/24 Javascript
设置jquery UI 控件的大小方法
2016/12/12 Javascript
Map.vue基于百度地图组件重构笔记分享
2017/04/17 Javascript
js实现canvas图片与img图片的相互转换的示例
2017/08/31 Javascript
详解如何用babel转换es6的class语法
2018/04/03 Javascript
vue mint-ui tabbar变组件使用
2018/05/04 Javascript
vue项目base64字符串转图片的实现代码
2018/07/13 Javascript
JavaScript实现简单的隐藏式侧边栏功能示例
2018/08/31 Javascript
13 个npm 快速开发技巧(推荐)
2019/07/04 Javascript
js针对图片加载失败的处理方法分析
2019/08/24 Javascript
Python实现爬取需要登录的网站完整示例
2017/08/19 Python
python的pytest框架之命令行参数详解(下)
2019/06/27 Python
Python获取命令实时输出-原样彩色输出并返回输出结果的示例
2019/07/11 Python
python tkinter实现屏保程序
2019/07/30 Python
python 矢量数据转栅格数据代码实例
2019/09/30 Python
Python hashlib模块实例使用详解
2019/12/24 Python
python网络编程之五子棋游戏
2020/05/14 Python
前端面试必备之CSS3的新特性
2017/09/05 HTML / CSS
俄语地区最大的中国商品在线购物网站之一:Umka Mall
2019/11/03 全球购物
请解释在new与override的区别
2012/10/29 面试题
编写一个类体现构造,公有,私有方法,静态,私有变量
2013/08/10 面试题
小学生秋游活动方案
2014/02/23 职场文书
旅游与酒店管理专业求职信
2014/07/21 职场文书
生物学专业求职信
2014/07/23 职场文书
大学生村官入党自传
2015/06/26 职场文书
Spring Cache和EhCache实现缓存管理方式
2021/06/15 Java/Android
java多态注意项小结
2021/10/16 Java/Android
Mysql索引失效 数据库表中有索引还是查询很慢
2022/05/15 MySQL