使用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 相关文章推荐
网页中的图片的处理方法与代码
Nov 26 Javascript
Asp.net下使用Jquery Ajax传送和接收DataTable的代码
Sep 12 Javascript
JavaScrip实现PHP print_r的数功能(三种方法)
Nov 12 Javascript
javascript页面加载完执行事件代码
Feb 11 Javascript
jQuery的Scrollify插件实现滑动到页面下一节点
Jul 05 Javascript
jquery自适应布局的简单实例
May 28 Javascript
javascript 广告移动特效的实现代码
Jun 25 Javascript
jQuery实现的瀑布流加载效果示例
Sep 13 Javascript
Angular ng-repeat 对象和数组遍历实例
Sep 14 Javascript
JavaScript 是什么意思
Sep 22 Javascript
有趣的bootstrap走动进度条
Dec 01 Javascript
JavaScript函数柯里化原理与用法分析
Mar 31 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/11/16 PHP
php学习笔记 [预定义数组(超全局数组)]
2011/06/09 PHP
PHP之autoload运行机制实例分析
2014/08/28 PHP
php使用ereg验证文件上传的方法
2014/12/16 PHP
PHP单例模式定义与使用实例详解
2017/02/06 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
2018/02/06 PHP
javascript 获取表单file全路径
2009/12/31 Javascript
js中的内部属性与delete操作符介绍
2015/08/10 Javascript
jquery实现初次打开有动画效果的网页TAB切换代码
2015/09/06 Javascript
老司机带你解读jQuery插件开发流程
2016/05/16 Javascript
Jquery Easyui菜单组件Menu使用详解(15)
2016/12/18 Javascript
Jquery实现跨域异步上传文件总结
2017/02/03 Javascript
使用vue.js编写蓝色拼图小游戏
2017/03/17 Javascript
React-native桥接Android原生开发详解
2018/01/17 Javascript
vue 国际化 vue-i18n 双语言 语言包
2018/06/07 Javascript
JavaScript实现手风琴效果
2021/02/18 Javascript
python 解析html之BeautifulSoup
2009/07/07 Python
使用python检测手机QQ在线状态的脚本代码
2013/02/10 Python
wxPython窗口的继承机制实例分析
2014/09/28 Python
Python中index()和seek()的用法(详解)
2017/04/27 Python
python中如何使用正则表达式的集合字符示例
2017/10/09 Python
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
2018/04/18 Python
numpy返回array中元素的index方法
2018/06/27 Python
python matplotlib画图库学习绘制常用的图
2019/03/19 Python
django实现用户注册实例讲解
2019/10/30 Python
基于python实现微信好友数据分析(简单)
2020/02/16 Python
10个python爬虫入门实例(小结)
2020/11/01 Python
城野医生官方海外旗舰店:风靡亚洲毛孔收敛水
2018/04/26 全球购物
Stokke美国官方网店:高级儿童家具、推车、汽车座椅和配件
2020/06/06 全球购物
学校安全防火方案
2014/06/07 职场文书
法制教育演讲稿
2014/09/10 职场文书
公司证明怎么写
2014/09/22 职场文书
朋友聚会开场白
2015/06/01 职场文书
地道战观后感400字
2015/06/04 职场文书
《葡萄沟》教学反思
2016/02/23 职场文书
Python Django项目和应用的创建详解
2021/11/27 Python