使用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 相关文章推荐
用Javscript实现表单复选框的全选功能
May 25 Javascript
javascript 三种方法实现获得和设置以及移除元素属性
Mar 20 Javascript
两种常用的javascript数组去重方法思路及代码
Mar 26 Javascript
对JavaScript中this指针的新理解分享
Jan 31 Javascript
JS+CSS实现实用的单击输入框弹出选择框的方法
Feb 28 Javascript
jquery实现仿新浪微博评论滚动效果
Aug 06 Javascript
基于javascript制作微博发布栏效果
Apr 04 Javascript
多功能jQuery树插件zTree实现权限列表简单实例
Jul 12 Javascript
JavaScript实现DOM对象选择器
Sep 24 Javascript
详解ES6中的代理模式——Proxy
Jan 08 Javascript
js正则相关知识点专题
May 10 Javascript
ant design vue中表格指定格式渲染方式
Oct 28 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图形计数器程序显示网站用户浏览量
2016/07/20 PHP
PHP使用xpath解析XML的方法详解
2017/05/20 PHP
PHP中关键字interface和implements详解
2017/06/14 PHP
JS无法捕获滚动条上的mouse up事件的原因猜想
2012/03/21 Javascript
ajax上传时参数提交不更新等相关问题
2012/12/11 Javascript
jquery的live使用注意事项
2014/02/18 Javascript
使用npm发布Node.JS程序包教程
2015/03/02 Javascript
JavaScript中匿名函数的用法及优缺点详解
2016/06/01 Javascript
Bootstrap进度条学习使用
2017/02/09 Javascript
nodejs开发——express路由与中间件
2017/03/24 NodeJs
详解前端路由实现与react-router使用姿势
2017/08/07 Javascript
vue跨域解决方法
2017/10/15 Javascript
详解如何使用webpack打包JS
2018/06/21 Javascript
jQuery md5加密插件jQuery.md5.js用法示例
2018/08/24 jQuery
webpack打包多页面的方法
2018/11/30 Javascript
自定义javascript验证框架示例【附源码下载】
2019/05/31 Javascript
使用jQuery mobile NuGet让你的网站在移动设备上同样精彩
2019/06/18 jQuery
jQuery Datatables 动态列+跨列合并实现代码
2020/01/30 jQuery
Python使用Supervisor来管理进程的方法
2015/05/28 Python
python写日志封装类实例
2015/06/28 Python
python数据抓取分析的示例代码(python + mongodb)
2017/12/25 Python
详解用python写网络爬虫-爬取新浪微博评论
2019/05/10 Python
Django框架创建项目的方法入门教程
2019/11/04 Python
Python数据可视化:幂律分布实例详解
2019/12/07 Python
Python如何用filter函数筛选数据
2020/03/05 Python
HTML5 device access 设备访问详解
2018/05/24 HTML / CSS
html5是什么_动力节点Java学院整理
2017/07/07 HTML / CSS
html5.2 dialog简介详解
2018/02/27 HTML / CSS
YSL圣罗兰美妆官方旗舰店:购买YSL口红
2018/04/16 全球购物
年度考核评语
2014/01/19 职场文书
行政专员的岗位职责
2014/03/10 职场文书
年终总结会议主持词
2014/03/17 职场文书
企业党员公开承诺书
2014/03/26 职场文书
初中学生期末评语
2014/04/24 职场文书
应聘英语教师求职信
2014/04/24 职场文书
Python 绘制多因子柱状图
2022/05/11 Python