使用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 相关文章推荐
兼容IE和FF的js脚本代码小结(比较常用)
Dec 06 Javascript
基于jQuery的message插件实现右下角弹出消息框
Jan 11 Javascript
js浮动图片的动态效果
Jul 10 Javascript
jquery正则表达式验证(手机号、身份证号、中文名称)
Dec 31 Javascript
JS集成fckeditor及判断内容是否为空的方法
May 27 Javascript
JavaScript DOM 对象深入了解
Jul 20 Javascript
jQuery使用siblings获取某元素所有同辈(兄弟姐妹)元素用法示例
Jan 30 Javascript
javascript中new Array()和var arr=[]用法区别
Dec 01 Javascript
Vue 进入/离开动画效果
Dec 26 Javascript
jQuery判断自定义属性data-val用法示例
Jan 07 jQuery
详解vue中多个有顺序要求的异步操作处理
Oct 29 Javascript
element-ui如何防止重复提交的方法步骤
Dec 09 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伪造referer突破网盘禁止外连的代码
2008/06/15 PHP
php笔记之:AOP的应用
2013/04/24 PHP
php实现压缩多个CSS与JS文件的方法
2014/11/11 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
2016/11/25 PHP
PHP实现对xml进行简单的增删改查(CRUD)操作示例
2017/05/19 PHP
KindEditor在php环境下上传图片功能集成的方法示例
2020/07/20 PHP
javascript中的几个运算符
2007/06/29 Javascript
Javascript select下拉框操作常用方法
2009/11/09 Javascript
DB.ASP 用Javascript写ASP很灵活很好用很easy
2011/07/31 Javascript
js使用setTimeout实现定时炸弹的方法
2015/04/10 Javascript
分步解析JavaScript实现tab选项卡自动切换功能
2016/01/25 Javascript
JavaScript浏览器对象之一Window对象详解
2016/06/03 Javascript
jQuery中DOM节点删除之empty与remove
2017/01/20 Javascript
javascript中apply/call和bind的使用
2017/02/15 Javascript
微信小程序使用modal组件弹出对话框功能示例
2017/11/29 Javascript
Vue导出json数据到Excel电子表格的示例
2017/12/04 Javascript
从Vuex中取出数组赋值给新的数组,新数组push时报错的解决方法
2018/09/18 Javascript
微信小程序自定义组件的实现方法及自定义组件与页面间的数据传递问题
2018/10/09 Javascript
JavaScript作用域链实例详解
2019/01/21 Javascript
VUE中使用MUI方法
2019/02/12 Javascript
浅谈一个webpack构建速度优化误区
2019/06/24 Javascript
vue视频播放暂停代码
2019/11/08 Javascript
js实现搜索提示框效果
2020/09/05 Javascript
[05:08]DOTA2-DPC中国联赛3月6日Recap集锦
2021/03/11 DOTA
python使用socket进行简单网络连接的方法
2015/04/29 Python
基于python实现微信好友数据分析(简单)
2020/02/16 Python
使用python实现多维数据降维操作
2020/02/24 Python
python3 中使用urllib问题以及urllib详解
2020/08/03 Python
HTML5在手机端实现视频全屏展示方法
2020/11/23 HTML / CSS
合作意向书
2014/07/30 职场文书
缓刑人员思想汇报
2014/10/11 职场文书
领导班子整改方案和个人整改措施
2014/10/25 职场文书
党员示范岗材料
2014/12/19 职场文书
营销计划书范文
2015/01/17 职场文书
Promise面试题详解之控制并发
2021/05/14 面试题
Python开发简易五子棋小游戏
2022/05/02 Python