JavaScript 模塊介紹

2021-01-07 小象Web開發

當web應用代碼規模越來越龐大的時候,我們會把代碼分離到多個文件中,稱為「模塊」。一個模塊通常是一個類或者多個函數組成的方法庫。

長期以來 JavaScript 是沒有模塊句法的,這不是一個問題,因為剛開始腳本比較少而且簡單,不需要模塊。但隨著代碼規模的增大,開始把代碼整理到模塊中,出現了一些庫:

AMD - 最早期的一個模塊規範,最開始由 require.js 實現了這個規範。CommonJS - Node.js 指定的規範UMD - 統一模塊規範,和 AMD, CommonJS 規範兼容。現在JS 有了「官方」的模塊系統,自 2015年成為規範之後逐步替換了上述幾種模塊,也已經在新版瀏覽器和 Node.js 得到了支持。

AMD 速覽

AMD是The Asynchronous Module Definition (AMD)的縮寫,這個規範主要用來定義模塊以實現模塊及其依賴可以異步加載。它的 API 也很簡單,一共2個:

define() 函數define(id?, dependencies?, factory);其中 id 和 dependencies 都是可選的。這個例子使用了3個參數:define("alpha", ["require", "exports", "beta"], function (require, exports, beta) { exports.verb = function() { return beta.verb(); //Or: return require("beta").verb(); }});這是一個只使用了一個參數的例子:define(function (require, exports, module) { var a = require('a'), b = require('b'); exports.action = function () {};});define.amd 屬性AMD規範要求具體的實現中 define 函數必須有一個 amd 屬性,主要目的是標識這個 define 函數是一個 AMD 的模塊,避免和已有的不遵循 AMD 規範的 define() 函數衝突。

CommonJS 速覽

CommonJS 主要用於伺服器端JS的規範,Node.js 採用此規範。

在模塊內部,有一個自由變量 require ,它是一個函數。在模塊內部,有一個自由變量 exports,它的格式是對象,可以把需要暴露給外部的屬性或者方法追加到此對象裡。在模塊內容,必須有一個自由變量 module,它是一個對象。例子1. 在一個模塊內部導出多個值:

// numbers.jsexports.a = 1exports.b = 2exports.c = 3exports.add = (x, y) => x + y

// test.jsconst { a, b, c, add } = require('./numbers.js'); console.log('a:', a);console.log('b:', b);console.log('c:', c);console.log('add(3,5):', add(3,5));

例子2.在一個模塊內部只導出一個值:

// numbers.jsmodule.exports = { a: 1, b: 2, c: 3, add: (x, y) => x + y}UMD 速覽

UMD (Universal Module Definition) 嚴格來說是一個設計模式,並不是一個規範。它嘗試兼容目前已有的幾種模塊規範方便加載,同時支持 AMD 和 CommonJS 規範。

(function (root, factory) { if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define([], factory); } else if (typeof module === 'object' && module.exports) { // Node. Does not work with strict CommonJS, but // only CommonJS-like environments that support module.exports, // like Node. module.exports = factory(); } else { // Browser globals (root is window) root.returnExports = factory(); }}(typeof self !== 'undefined' ? self : this, function () { // Just return a value to define the module export. // This example returns an object, but the module // can return a function as the exported value. return {};}));

ES module

對於 ESM 來說,一個模塊就是一個文件。模塊之間可以使用 export 和 import 導出和導入。

export 關鍵字可以把當前模塊中的變量或者函數暴露出來,方便被其他模塊使用import 關鍵字可以把其他模塊導入進來

import 句法:

import defaultExport from "module-name";import * as name from "module-name";import { export1 } from "module-name";import { export1 as alias1 } from "module-name";import { export1 , export2 } from "module-name";import { foo , bar } from "module-name/path/to/specific/un-exported/file";import { export1 , export2 as alias2 , [...] } from "module-name";import defaultExport, { export1 [ , [...] ] } from "module-name";import defaultExport, * as name from "module-name";import "module-name";var promise = import("module-name");

export 句法:

// Exporting individual featuresexport let name1, name2, …, nameN; // also var, constexport let name1 = …, name2 = …, …, nameN; // also var, constexport function functionName(){...}export class ClassName {...} // Export listexport { name1, name2, …, nameN }; // Renaming exportsexport { variable1 as name1, variable2 as name2, …, nameN }; // Exporting destructured assignments with renamingexport const { name1, name2: bar } = o; // Default exportsexport default expression;export default function (…) { … } // also class, function*export default function name1(…) { … } // also class, function*export { name1 as default, … }; // Aggregating modulesexport * from …; // does not set the default exportexport * as name1 from …;export { name1, name2, …, nameN } from …;export { import1 as name1, import2 as name2, …, nameN } from …;export { default } from …;

例如

// sayHi.jsexport function sayHi(user) { alert(`Hello, ${user}!`);}

在其他文件中可以引入此文件:

// main.jsimport {sayHi} from './sayHi.js'; alert(sayHi); // function...sayHi('John'); // Hello, John!

模塊主要的特點

模塊內部的代碼總是處於嚴格模式。use strict 模塊級別的作用域模塊之間的變量如果沒有export默認是相互隔離的,要解決上述問題,可以把變量導出一個模塊中的代碼只有在首次加載時執行import.meta在模塊內部 this 關鍵字是 undefined

相關焦點

  • JavaScript引入模塊的歷史簡介
    很長一段時間,JavaScript 都沒有語言級(language-level)的模塊語法。這不是一個問題,因為最初的腳本又小又簡單,所以沒必要將其模塊化。但是最終腳本變得越來越複雜,因此社區發明了許多種方法來將代碼組織到模塊中,使用特殊的庫按需加載模塊。
  • JavaScript組件模式深入淺出
    匿名閉包(Anonymous Closures)這是使得模式可以正常工作的語言基礎,也實在是javascript最為實用的特性之一。我們可以簡單的創建一個匿名函數,並且立刻執行它。所有運行在該函數裡的代碼叫做一個閉包,它提供了在整個應用程式生命周期中都有效的數據隱私控制以及狀態保存功能。
  • Javascript.info - 更新頻率極高的Javascript免費開源電子教程
    介紹Javascript.info 是一個以最新JavaScript 標準為基準的在線教程。更新頻率非常高,我在寫這篇文章的時候是2020年9月7日,而最新修改更新的日期是昨天。Javascript.info 首頁截圖Javascript.info 依託 learn.javascript.ru 而來的,learn.javascript.ru 是俄羅斯最大的 JavaScript 教程和學習平臺之一。
  • 《重裝上陣》近戰模塊小指頭介紹
    重裝上陣無限戰車中有個非常可愛的近戰模組,小指頭,很多小夥伴都好奇小指頭的強度怎麼樣,今天小編給大家帶來了《重裝上陣》近戰模塊小指頭介紹,感興趣的小夥伴一起來看看吧。 《重裝上陣》近戰模塊小指頭介紹 一、模塊介紹 近戰模塊【小指頭】
  • 《重裝上陣》輔助模塊大力神介紹
    重裝上陣中,很多小夥伴看到大力神居然是一個輔助模組,就感覺她不厲害,今天小編給大家帶來了《重裝上陣》輔助模塊大力神介紹,感興趣的小夥伴一起來看看吧。 《重裝上陣》輔助模塊大力神介紹 一、模塊介紹 輔助模塊【大力神】
  • 用Java語言巧妙實現javascript的運行
    Java前言在學習開發的過程中javascript是每位程式設計師小盆友都得掌握的一種方法,他們可以說是貫穿了整個Java開發的語言,下面給大家演示一下在Java中如何完美運行javascript案例,跟著小編一起來學習一下吧
  • 初識javascript,JS的歷史_騰訊新聞
    javascript和H5的關關係 什麼是HTML5? javascript的應用範圍 1.PC端web開發(網站) 2.移動端開發(webApp、混合App)服務端開發(NodeJs) 3.遊戲開發(unity3D-TypeScript,網頁遊戲)在線演示:忍者水果
  • 前端:用javascript實現一個轉盤小遊戲?
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫本文主要介紹如何使用原生javascript和Css3來實現一個在各大移動應用中經常出現的轉盤遊戲,由於改實現可以有不同方式,如果熟悉canvas的話也可以用canvas實現,本文採用js和css實現主要考慮到複雜度較小性能較好
  • JavaScript小知識:String類型
    let lang="java";lang=lange+"scriot";console.log(lang);//javascript我們首先創建變量lang用來保存字符串java,然後我們將lang保存的字符串改為由原先保存字符串java和新的字符串
  • Javascript去除字符串中的點或其他符號
    在前端上使用javascript進行操作的。測試了兩次沒有好用,程序直接把整個字符串都進行了替換,在考慮這個是為什麼呢?javascript(請忽略此配圖)示例var ip = data.field.ip.replace(/.
  • javascript基礎修煉——手把手教你造一個簡易的require.js
    研究模塊化加載邏輯對於開發者理解javascript回調的運行機制非常有幫助,同時也可以提高抽象編程能力。,當下載到定義business1模塊的文件scripts/business1.js後,寫在該文件中的define方法會被執行,此時又發現當前模塊依賴business3模塊,程序又會延遲生成business1模塊的工廠方法(也就是scripts/business1.js中傳入define方法的最後一個函數參數),轉而先去加載business3這個模塊,如果define方法沒有聲明依賴,或者聲明的依賴都已經加載
  • 第一篇:JavaScript基本語法
    html><head><title>這是登錄頁面</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><script type="text/javascript
  • 高隔離度IGBT DC模塊詳細介紹
    打開APP 高隔離度IGBT DC模塊詳細介紹 胡薇 發表於 2018-07-24 16:37:45 在工業應用環境中,電子設備將面臨複雜的電磁幹擾環境
  • 什麼是JavaScript對象?如何創建並引用?這就告訴你!
    c.使用Object.create方法創建對象var obj1 = {};var obj2 = new Object();var obj3 = Object.create(null);Object是在javascript
  • 無線通訊模塊的功能以及應用特點的詳細介紹
    打開APP 無線通訊模塊的功能以及應用特點的詳細介紹 zstel 發表於 2020-12-18 15:06:22 作為連接物聯網感知層和網絡層的關鍵環節,無線通信模塊屬於底層硬體部分,具有不可替代性,它與物聯網終端之間存在著一一對應的關係。
  • 第五篇:JavaScript事件處理
    庫的網頁代碼(案例代碼見unit12\case1.html):<html><head><title>JavaScript開發案例</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><script type="text/javascript
  • 20個常用的JavaScript簡寫技巧
    箭頭函數 參考:JavaScript Arrow function https://jscurious.com/javascript-arrow-function/ 8. 模板字符串 我們一般使用 + 運算符來連接字符串變量。
  • 如何使用JavaScript實現前端導入和導出excel文件
    1.2 實現一鍵導入excel文件並生成table表格導入excel文件的功能我們可以用javascript原生的方式實現解析, 比如可以用fileReader這些原生api,但考慮到開發效率和後期的維護, 筆者這裡採用antd的Upload組件和XLSX來實現上傳文件並解析的功能.
  • ...4G模塊是什麼?4G模組,4G模塊的平臺?4G模組,4G模塊怎麼選?ASR...
    打開APP 4G模組, 4G模塊是什麼?4G模組,4G模塊的平臺?4G模組,4G模塊怎麼選? 4G模塊是什麼 4G模塊是什麼?4G模塊是指第四代通訊技術模塊,4G模塊是支持TD-LTE和FDD-LTE的LTE網絡制式,本文主要介紹的為4G cat4 產品,Cat4  FDD下行為150Mbps, 上行為50Mbps, TDD下行為130Mbps,上行為35Mbps 。
  • 九個難以置信的HTML5和JavaScript實驗
    一款javascript遊戲,點擊和控制藍色的盒子,讓黃色的點擊不要碰到紅色的點。       5.Sketch 3D