使用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 document.images实例
May 27 Javascript
利用onresize使得div可以随着屏幕大小而自适应的代码
Jan 15 Javascript
javascript 触发HTML元素绑定的函数
Sep 11 Javascript
谈谈JavaScript中function多重理解
Aug 28 Javascript
基于jquery实现动态竖向柱状条特效
Feb 12 Javascript
详解JavaScript中数组的reduce方法
Dec 02 Javascript
Angular2使用jQuery的方法教程
May 28 jQuery
VsCode新建VueJs项目的详细步骤
Sep 23 Javascript
轻量级JS Cookie插件js-cookie的使用方法
Mar 22 Javascript
angular 实时监听input框value值的变化触发函数方法
Aug 31 Javascript
vue2.0实现的tab标签切换效果(内容可自定义)示例
Feb 11 Javascript
layui自定义工具栏的方法
Sep 19 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
人大复印资料处理程序_输入篇
2006/10/09 PHP
第七节--类的静态成员
2006/11/16 PHP
PHP file_exists问题杂谈
2012/05/07 PHP
php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析
2014/06/10 PHP
php数组合并与拆分实例分析
2015/06/12 PHP
PHP判断数组是否为空的常用方法(五种方法)
2017/02/08 PHP
php文件上传及下载附带显示文件及目录功能
2017/04/27 PHP
通过身份证号得到出生日期和性别的js代码
2009/11/23 Javascript
javascript算法学习(直接插入排序)
2011/04/12 Javascript
JavaScript 判断浏览器是否支持SVG的代码
2013/03/21 Javascript
禁用页面部分JavaScript不是全部而是部分
2014/09/03 Javascript
JavaScript判断变量是否为空的自定义函数分享
2015/01/31 Javascript
jQuery插件pagination实现分页特效
2015/04/12 Javascript
javascript基础知识
2016/06/07 Javascript
jQuery+ajax实现实用的点赞插件代码
2016/07/06 Javascript
node.js版本管理工具n无效的原理和解决方法
2016/11/24 Javascript
JQuery和HTML5 Canvas实现弹幕效果
2017/01/04 Javascript
从零学习node.js之mysql数据库的操作(五)
2017/02/24 Javascript
jQuery层叠选择器用法实例分析
2019/06/28 jQuery
layui 对弹窗 form表单赋值的实现方法
2019/09/04 Javascript
js面向对象之实现淘宝放大镜
2020/01/15 Javascript
在vue中实现给每个页面顶部设置title
2020/07/29 Javascript
Python while、for、生成器、列表推导等语句的执行效率测试
2015/06/03 Python
python中函数传参详解
2016/07/03 Python
利用Python破解验证码实例详解
2016/12/08 Python
Python编程求解二叉树中和为某一值的路径代码示例
2018/01/04 Python
Django 忘记管理员或忘记管理员密码 重设登录密码的方法
2018/05/30 Python
详解Django-restframework 之频率源码分析
2019/02/27 Python
python模拟点击网页按钮实现方法
2020/02/25 Python
Python库skimage绘制二值图像代码实例
2020/04/10 Python
英国奢侈品网站:MatchesFashion
2016/12/16 全球购物
zooplus波兰:在线宠物店
2019/07/21 全球购物
档案接收函
2014/01/13 职场文书
国庆节标语大全
2014/10/08 职场文书
父亲节感言
2015/08/03 职场文书
2016年6月份红领巾广播稿
2015/12/21 职场文书