使用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设置cookie过期及清除浏览器对应名称的cookie
Oct 24 Javascript
javascript ajax 仿百度分页函数
Oct 29 Javascript
Mac地址验证的javascript代码
Nov 09 Javascript
javascript中数组的冒泡排序使用示例
Dec 18 Javascript
jQuery Ajax()方法使用指南
Nov 19 Javascript
js下将金额数字每三位一逗号分隔
Feb 19 Javascript
Bootstrap Chart组件使用教程
Apr 28 Javascript
彻底学会Angular.js中的transclusion
Mar 12 Javascript
使用Bootstrap打造特色进度条效果
May 02 Javascript
利用nvm管理多个版本的node.js与npm详解
Nov 02 Javascript
JavaScript鼠标悬停事件用法解析
May 15 Javascript
JavaScript canvas实现雨滴特效
Jan 10 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读取纯真ip数据库使用示例
2014/01/26 PHP
PHP以json或xml格式返回请求数据的方法
2018/05/31 PHP
javascript 支持ie和firefox杰奇翻页函数
2008/07/22 Javascript
5款Javascript颜色选择器
2009/10/25 Javascript
javascript中字符串拼接需注意的问题
2010/07/13 Javascript
使用jQuery轻松实现Ajax的实例代码
2010/08/16 Javascript
jQuery ajax 路由和过滤器使用说明
2011/08/02 Javascript
javascript实现颜色渐变的方法
2013/10/30 Javascript
基于jquery实现放大镜效果
2015/08/17 Javascript
深入学习JavaScript对象
2015/10/13 Javascript
jQuery实现的左右移动焦点图效果
2016/01/14 Javascript
jquery ajax结合thinkphp的getjson实现跨域的方法
2016/06/06 Javascript
JS获取checkbox的个数简单实例
2016/08/19 Javascript
JS实现物体带缓冲的间歇运动效果示例
2016/12/22 Javascript
vue使用watch 观察路由变化,重新获取内容
2017/03/08 Javascript
JavaScript通过mouseover()实现图片变大效果的示例
2017/12/20 Javascript
npm 下载指定版本的组件方法
2018/05/17 Javascript
微信小程序自定义单项选择器样式
2019/07/25 Javascript
JS实现旋转木马轮播图
2020/01/01 Javascript
用ReactJS和Python的Flask框架编写留言板的代码示例
2015/12/19 Python
Python数组定义方法
2016/04/13 Python
最大K个数问题的Python版解法总结
2016/06/16 Python
详解Python下载图片并保存本地的两种方式
2019/05/15 Python
python中字符串数组逆序排列方法总结
2019/06/23 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
2020/02/27 Python
利用Python pandas对Excel进行合并的方法示例
2020/11/04 Python
澳大利亚实惠时尚女装商店:Katies
2019/06/16 全球购物
美津浓巴西官方网站:Mizuno巴西
2019/07/24 全球购物
党校培训思想汇报
2013/12/30 职场文书
求职教师自荐书
2014/06/19 职场文书
电子商务优秀毕业生求职信
2014/07/11 职场文书
毕业生评语大全
2015/01/04 职场文书
抗洪救灾感谢信
2015/01/22 职场文书
风雨哈佛路观后感
2015/06/03 职场文书
歼十出击观后感
2015/06/11 职场文书
MySQL不使用order by实现排名的三种思路总结
2021/06/02 MySQL