使用Browserify來實現CommonJS的瀏覽器載入

来源:http://www.cnblogs.com/xiaohuochai/archive/2017/05/13/6850977.html
-Advertisement-
Play Games

前面的話 Nodejs的模塊是基於CommonJS規範實現的,可不可以應用在瀏覽器環境中呢? 第二行math.add(2, 3),在第一行require('math')之後運行,因此必須等math.js載入完成。也就是說,如果載入時間很長,整個應用就會停在那裡等。這對伺服器端不是一個問題,因為所有的 ...


前面的話

  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了

【安裝】

  使用下列命令安裝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到底做了什麼?安裝一下browser-unpack,就能清楚原理了

$ npm install browser-unpack -g

  然後,使用下列命令,將前面生成的bb.js解包

$ browser-unpack < bb.js

  可以看到,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依然存在


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前端迷思與React.js 前端技術這幾年蓬勃發展, 這是當時某幾個項目需要做前端技術選型時, 相關資料整理, 部分評論引用自社區。 開始吧: 目前, Web 開發技術框架選型為兩種的占 80% 。這種戲劇性的變化持續了近 6 年。 自 2013 年 5 月推出以來,ReactJS 在過去三年中已成... ...
  • 本文為轉載文章,文章來自:王輝|十億級視頻播放技術優化揭密 QCon是由InfoQ主辦的全球頂級技術盛會,每年在倫敦、北京、東京、紐約、聖保羅、上海、舊金山召開。自 2007年 3月份首次舉辦以來,已經有超萬名高級技術人員參加過QCon大會。QCon內容源於實踐並面向社區,演講嘉賓依據熱點話題,面向 ...
  • 無論是jquery還是zepto,都離不開$,這個符號似乎是萬能的,這篇文章通過zepto源碼來探究的就是$實現的原理。 ...
  • 原文:12 Extremely Useful Hacks for JavaScript 作者:Caio Ribeiro Pereira 翻譯:雁驚寒 ...
  • 1.Vuejs組件 這裡註意一點,組件要先註冊再使用,也就是說 如果反過來會報錯,因為反過來代表先使用了組件的,但是組件卻沒註冊。 webpack報錯後,使用webpack --display-error-details可以排錯 2.指令keep-alive 在看demo的時候看到在vue-rout ...
  • 新公司已經呆了一個多月,目前著手一個數據可視化的項目,數據可視化肯定要用到圖形庫如 、 、 、 等,經決定我的這個項目用阿裡旗下螞蟻金服所開發的 圖表庫。 官方地址:https://antv.alipay.com/g2/doc/index.html Github:https://github.com ...
  • 一、jQuery 提供開發者開發插件的幾種模式 1.$.extend(); //這個方法是綁定在$上面的。可以通過$直接調用 2.$.fn.方法名 //這個方法是綁定在Dom對象上面的可以通過$('').方法名();調用 3.$.widget //通過jQuery UI 部件工廠模式創建。 二、插件 ...
  • 關於CSS3的3D立方體動畫 知識點: 1、每個元素有獨立的坐標系 2、坐標系隨當前元素的改變而發生改變 3、立方體由靜態transform參數構成 4、通過給容器添加動畫使立方體運動 效果圖: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...