日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Javascript 模块化指北

發布時間:2024/8/23 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Javascript 模块化指北 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

隨著 Web 技術的蓬勃發展和依賴的基礎設施日益完善,前端領域逐漸從瀏覽器擴展至服務端(Node.js),桌面端(PC、Android、iOS),乃至于物聯網設備(IoT),其中 JavaScript 承載著這些應用程序的核心部分,隨著其規模化和復雜度的成倍增長,其軟件工程體系也隨之建立起來(協同開發、單元測試、需求和缺陷管理等),模塊化編程的需求日益迫切。JavaScript 對模塊化編程的支持尚未形成規范,難以堪此重任;一時間,江湖俠士挺身而出,一路披荊斬棘,從刀耕火種過渡到面向未來的模塊化方案;

概念

模塊化編程就是通過組合一些__相對獨立可復用的模塊__來進行功能的實現,其最核心的兩部分是__定義模塊__和__引入模塊__;

  • 定義模塊時,每個模塊內部的執行邏輯是不被外部感知的,只是導出(暴露)出部分方法和數據;
  • 引入模塊時,同步 / 異步去加載待引入的代碼,執行并獲取到其暴露的方法和數據;

刀耕火種

盡管 JavaScript 語言層面并未提供模塊化的解決方案,但利用其可__面向對象__的語言特性,外加__設計模式__加持,能夠實現一些簡單的模塊化的架構;經典的一個案例是利用單例模式模式去實現模塊化,可以對模塊進行較好的封裝,只暴露部分信息給需要使用模塊的地方;

// Define a module var moduleA = (function ($, doc) {var methodA = function() {};var dataA = {};return {methodA: methodA,dataA: dataA}; })(jQuery, document);// Use a module var result = moduleA.mehodA();

直觀來看,通過立即執行函數(IIFE)來聲明依賴以及導出數據,這與當下的模塊化方案并無巨大的差異,可本質上卻有千差萬別,無法滿足的一些重要的特性;

  • 定義模塊時,聲明的依賴不是強制自動引入的,即在定義該模塊之前,必須手動引入依賴的模塊代碼;
  • 定義模塊時,其代碼就已經完成執行過程,無法實現按需加載;
  • 跨文件使用模塊時,需要將模塊掛載到全局變量(window)上;

AMD & CMD 二分天下

題外話:由于年代久遠,這兩種模塊化方案逐漸淡出歷史舞臺,具體特性不再細聊;

為了解決”刀耕火種”時代存留的需求,AMD 和 CMD 模塊化規范問世,解決了在瀏覽器端的異步模塊化編程的需求,__其最核心的原理是通過動態加載 script 和事件監聽的方式來異步加載模塊;__

AMD 和 CMD 最具代表的兩個作品分別對應 require.js 和 sea.js;其主要區別在于依賴聲明和依賴加載的時機,其中 require.js 默認在聲明時執行, sea.js 推崇懶加載和按需使用;另外值得一提的是,CMD 規范的寫法和 CommonJS 極為相近,只需稍作修改,就能在 CommonJS 中使用。參考下面的 Case 更有助于理解;

// AMD define(['./a','./b'], function (moduleA, moduleB) {// 依賴前置moduleA.mehodA();console.log(moduleB.dataB);// 導出數據return {}; });// CMD define(function (requie, exports, module) {// 依賴就近var moduleA = require('./a');moduleA.mehodA(); // 按需加載if (needModuleB) {var moduleB = requie('./b');moduleB.methodB();}// 導出數據exports = {}; });

CommonJS

2009 年 ry 發布 Node.js 的第一個版本,CommonJS 作為其中最核心的特性之一,適用于服務端下的場景;歷年來的考察和時間的洗禮,以及前端工程化對其的充分支持,CommonJS 被廣泛運用于 Node.js 和瀏覽器;

// Core Module const cp = require('child_process'); // Npm Module const axios = require('axios'); // Custom Module const foo = require('./foo');module.exports = { axios }; exports.foo = foo;

規范

  • module (Object): 模塊本身
  • exports (*): 模塊的導出部分,即暴露出來的內容
  • require (Function): 加載模塊的函數,獲得目標模塊的導出值(基礎類型為復制,引用類型為淺拷貝),可以加載內置模塊、npm 模塊和自定義模塊

實現

1、模塊定義

默認任意 .node .js .json 文件都是符合規范的模塊;

2、引入模塊

首先從緩存(require.cache)優先讀取模塊,如果未命中緩存,則進行路徑分析,然后按照不同類型的模塊處理:

  • 內置模塊,直接從內存加載;
  • 外部模塊,首先進行文件尋址定位,然后進行編譯和執行,最終得到對應的導出值;

其中在編譯的過程中,Node對獲取的JavaScript文件內容進行了頭尾包裝,結果如下:

(function (exports, require, module, __filename, __dirname) {var circle = require('./circle.js');console.log('The area of a circle of radius 4 is ' + circle.area(4)); });

特性總結

  • 同步執行模塊聲明和引入邏輯,分析一些復雜的依賴引用(如循環依賴)時需注意;
  • 緩存機制,性能更優,同時限制了內存占用;
  • Module 模塊可供改造的靈活度高,可以實現一些定制需求(如熱更新、任意文件類型模塊支持);

ES Module(推薦使用)

ES Module 是語言層面的模塊化方案,由 ES 2015 提出,其規范與 CommonJS 比之 ,導出的值都可以看成是一個具備多個屬性或者方法的對象,可以實現互相兼容;但寫法上 ES Module 更簡潔,與 Python 接近;

import fs from 'fs'; import color from 'color'; import service, { getArticles?} from '../service'; export default service; export const getArticles = getArticles;

主要差異在于:

  • ES Module 會對靜態代碼分析,即在代碼編譯時進行模塊的加載,在運行時之前就已經確定了依賴關系(可解決循環引用的問題);
  • ES Module 關鍵字:import?export?以及獨有的?default?關鍵字,確定默認的導出值;
  • ES Module 中導出的值是一個?只讀的值的引用?,無論基礎類型和復雜類型,而在 CommonJS 中 require 的是值的拷貝,其中復雜類型是值的淺拷貝;
// a.js export let a = 1; export function caculate() {a++; };// b.js import { a, caculate } from 'a.js';console.log(a); // 1 caculate(); console.log(a); // 2a = 2; // Syntax Error: "a" is read-only

UMD

通過一層自執行函數來兼容各種模塊化規范的寫法,兼容 AMD / CMD / CommonJS 等模塊化規范,貼上代碼勝過千言萬語,需要特別注意的是 ES Module 由于會對靜態代碼進行分析,故這種運行時的方案無法使用,此時通過 CommonJS 進行兼容;

(function (global, factory) {if (typeof exports === 'object') { module.exports = factory();} else if (typeof define === 'function' && define.amd) {define(factory);} else {this.eventUtil = factory();} })(this, function (exports) {? // Define ModuleObject.defineProperty(exports, "__esModule", {value: true});exports.default = 42; });

構建工具中的實現

為了在瀏覽器環境中運行模塊化的代碼,需要借助一些模塊化打包的工具進行打包( 以 webpack 為例),定義了項目入口之后,會先快速地進行依賴的分析,然后將所有依賴的模塊轉換成瀏覽器兼容的對應模塊化規范的實現;

模塊化的基礎

從上面的介紹中,我們已經對其規范和實現有了一定的了解;在瀏覽器中,要實現 CommonJS 規范,只需要實現 module / exports / require / global 這幾個屬性,由于瀏覽器中是無法訪問文件系統的,因此 require 過程中的文件定位需要改造為加載對應的 JS 片段(webpack 采用的方式為通過函數傳參實現依賴的引入)。

webpack 打包出來的代碼快照如下,注意看注釋中的時序;

(function (modules) {// The module cachevar installedModules = {};// The require functionfunction __webpack_require__(moduleId) {}return __webpack_require__(0); // ---> 0 }) ({0: function (module, exports, __webpack_require__) {// Define module Avar moduleB = __webpack_require__(1); // ---> 1},1: function (module, exports, __webpack_require__) {// Define module Bexports = {}; // ---> 2} });

實際上,ES Module 的處理同 CommonJS 相差無幾,只是在定義模塊和引入模塊時會去處理 __esModule 標識,從而兼容其在語法上的差異。

異步和擴展

1、瀏覽器環境下,網絡資源受到較大的限制,因此打包出來的文件如果體積巨大,對頁面性能的損耗極大,因此需要對構建的目標文件進行拆分,同時模塊也需要支持動態加載;

webpack 提供了兩個方法 require.ensure() 和 import() (推薦使用)進行模塊的動態加載,至于其中的原理,跟上面提及的 AMD & CMD 所見略同,import() 執行后返回一個 Promise 對象,其中所做的工作無非也是動態新增 script 標簽,然后通過 onload / onerror 事件進一步處理。

2、由于 require 函數是完全自定義的,我們可以在模塊化中實現更多的特性,比如通過修改 require.resolve 或 Module._extensions 擴展支持的文件類型,使得 css / .jsx / .vue / 圖片等文件也能為模塊化所使用;


原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。

總結

以上是生活随笔為你收集整理的Javascript 模块化指北的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美不卡一区二区 | 亚洲小视频在线 | 伦理片中文字幕 | 99久久99久久精品国产片桃花 | 青青在线视频观看 | 亚洲一二三av | 国产日产亚洲精品 | 在线播放黄色av | 久久伊人影院 | 三级av在线免费观看 | 91视频国产精品 | 亚洲成人无码久久 | 成人观看网站 | 天天天操操操 | 黄瓜视频成人 | 久久久精品一区二区三区 | 在线麻豆视频 | 国产一区二区三区免费观看视频 | 麻豆精品免费观看 | 亚洲高清不卡 | 日韩精品视频一区二区在线观看 | 国产不卡网 | 好吊色网站 | 51嘿嘿嘿国产精品伦理 | 欧美视频一二三 | 99久久一区| 东北少妇bbbb搡bbb搡 | 日韩中文字幕免费视频 | 韩国成人理伦片免费播放 | 欧美群交射精内射颜射潮喷 | jizzjizz亚洲| 中文字幕第页 | 69av导航| 国产一伦一伦一伦 | 欧美少妇在线 | 情侣黄网站免费看 | 欧美做受高潮中文字幕 | 九九涩 | 啪啪av导航 | 日韩一区二区三区在线看 | 777久久久精品一区二区三区 | 草草影院1| 制服.丝袜.亚洲.中文.综合懂 | 成人在线观看免费 | 艳妇臀荡乳欲伦交换gif | 777亚洲| 天天爽天天爽天天爽 | 久久亚洲网站 | 亚洲精品乱码久久久久久黑人 | 国产片网站 | 亚洲香蕉在线观看 | 枫可怜av| 国产黄色大片在线观看 | 久久99热久久99精品 | 一级坐爱片| 爱情岛论坛亚洲入口 | 搡老熟女老女人一区二区 | 亚洲一区二区三区久久久成人动漫 | 国产一区二区三区视频在线观看 | 亚洲综合小说 | 国产美女被遭强高潮免费网站 | h网站在线看| 国产精品久久久久久久久借妻 | 日本一区二区不卡视频 | 国产人久久人人人人爽 | 第一章激情艳妇 | 日本打屁股网站 | 夜av| 手机在线看片国产 | 国产精品伦一区二区三区免费看 | 日韩免费高清视频网站 | 日本亚洲国产 | 亚洲乱子伦 | 欧美日韩在线免费 | 男女日屁视频 | 91超级碰| 风流少妇一区二区三区91 | 日韩中文字幕视频在线观看 | 国产精品理论在线观看 | 可以免费看av的网址 | 日本中文字幕网站 | 日本不卡一区二区三区 | 91精品国产99久久久久久 | a爱视频 | 免费成人在线观看 | www国产91 | 丁香婷婷久久久综合精品国产 | 四十路av | 伊人狼人久久 | 欧美麻豆| 国产传媒国产传媒 | 在线视频a | 成人性生交大片 | va在线播放 | 男人爱看的网站 | www九色 | 亚洲av无码乱码国产麻豆 | 色偷偷噜噜噜亚洲男人 | 免费观看成人 |