国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

commonjs

這篇具有很好參考價值的文章主要介紹了commonjs。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Commonjs

什么是 CommonJs

  1. CommonJs 是 js 模塊化的社區(qū)規(guī)范

模塊化產(chǎn)生的原因

  1. 隨著前端頁面復(fù)雜度的提升,依賴的第三方庫的增加,導(dǎo)致的 js 依賴混亂,全局變量的污染,和命名沖突
  2. 單個 js 文件內(nèi)容太多,導(dǎo)致了維護困難,拆分成為多個文件又會發(fā)生第一點描述的問題
  3. v8 引擎的出現(xiàn),讓 js 有了媲美編譯型語言的運行速度,大大激勵了前端開發(fā)者

CommonJS 的使用環(huán)境

  1. nodejs 實現(xiàn)了 CommonJS 模塊化規(guī)范

CommonJs 有哪些規(guī)定

  1. 每一個文件就是一個模塊
  2. 模塊中的變量和函數(shù)不會污染全局(解決了全局污染和命名沖突)
  3. 提供給外部使用的內(nèi)容需要導(dǎo)出
  4. 使用其他模塊的內(nèi)容需要導(dǎo)入 (模塊的導(dǎo)入和導(dǎo)出共同解決了 js 依賴混亂的問題)
  5. 模塊不會重復(fù)加載,模塊第一次導(dǎo)入后會將第一次導(dǎo)入的結(jié)果緩存,下次導(dǎo)入時,直接使用緩存的結(jié)構(gòu)
  6. 省略一些細(xì)碎的內(nèi)容在下面代碼中提及.....

commonJS 語法

  1. 導(dǎo)入
//這是導(dǎo)入一個模塊,module.js;commonjs中規(guī)定require導(dǎo)入模塊時可以省略.js后綴
const module1 = require("./module1");
//如果沒有尋找到dir.js文件,而發(fā)現(xiàn)了dir路徑,則尋找dir路徑下package.json 的main屬性指定的文件
//如果package.json未指定路徑,則觸發(fā)默認(rèn)規(guī)則 依次查找查找 index.js index.json
const module2 = require("./dir");
//如果require不是相對路徑,則會去node_module中尋找該模塊,重復(fù)module1 和module2 的步驟
//如果沒有node_modules 或node_modules 中不存在模塊則繼續(xù)向上級目錄尋找node_modules,直到根目錄
const module3 = require("module3");
  1. 導(dǎo)出
module.exports = {
  //這里輸入導(dǎo)出的內(nèi)容
};

//這也是導(dǎo)出
exports.a = "a";

//注意 module.exports導(dǎo)出和exports[屬性名]導(dǎo)出不可共存
//module.exports會覆蓋掉exports導(dǎo)出的內(nèi)容

簡易實現(xiàn)類 nodejs 模塊化環(huán)境

const fs = require("fs");
const Path = require("path");
const vm = require("vm");
const ModuleStack = [];

function isRootDirectory(path) {
  // Windows 根路徑
  const windowsRootDirectory = /^[a-zA-Z]:\\$/;
  // Unix/Linux 根路徑/
  const unixRootDirectory = /^\//;

  return windowsRootDirectory.test(path) || unixRootDirectory.test(path);
}

function isRelativeDirectory(path) {
  //匹配 ../ 或者 ./開頭的路徑
  const relativeDirectory = /^(\.\.\/|\.\/).+/;
  return relativeDirectory.test(path);
}
// 計算node_modules路徑
let computePaths = (dirname) => {
  let paths = [];
  let path = dirname;
  let node_modules = "./node_modules";
  while (
    !isRootDirectory(path) ||
    !paths.includes(Path.resolve(path, node_modules))
  ) {
    paths.push(Path.resolve(path, node_modules));
    path = Path.resolve(path, "../");
  }
  return paths;
};

function myRequire(path) {
  let truelyPath;
  if (isRelativeDirectory(path)) {
    // 獲取真實路徑
    truelyPath = Path.resolve(__dirname, path);
  } else {
    //獲取可能的node_modules路徑
    let paths = computePaths(__dirname);
    for (const item of paths) {
      truelyPath = Path.resolve(item, path);
      if (fs.existsSync(truelyPath)) {
        break;
      }
    }
    if (!truelyPath) {
      throw new Error("Can't find module " + path);
    }
  }
  // 如果緩存中有,直接返回
  if (myRequire.cache[truelyPath]) {
    return myRequire.cache[truelyPath].exports;
  }
  // 讀取文件內(nèi)容
  const content = fs.readFileSync(path, "utf-8");
  // 包裝代碼
  const wrapper = [
    "(function (exports, require, module, __filename, __dirname) { \n",
    "\n})",
  ];
  // 拼接代碼
  const wrapperContent = wrapper[0] + content + wrapper[1];

  // 獲取文件路徑和文件名
  let dirname = Path.dirname(truelyPath);
  let filename = truelyPath;
  let parentModule =
    ModuleStack.length > 0 ? ModuleStack[ModuleStack.length - 1] : null;
  // 模塊對象
  const Module = {
    id: Object.keys(myRequire.cache).length > 0 ? filename : ".",
    path: dirname,
    exports: {},
    parent: parentModule,
    filename: filename,
    loaded: false,
    children: [],
    paths: computePaths(dirname),
  };
  if (parentModule) {
    parentModule.children.push(Module);
  }
  //模塊入棧
  ModuleStack.push(Module);
  // 需要運行的函數(shù)
  const moduleScope = vm.runInThisContext(wrapperContent);
  // 運行代碼
  moduleScope.call(
    Module.exports,
    Module.exports,
    myRequire,
    Module,
    filename,
    dirname
  );
  // 標(biāo)記模塊已加載
  Module.loaded = true;
  //模塊出棧
  ModuleStack.pop();
  // 緩存模塊
  myRequire.cache[truelyPath] = Module;
  return Module.exports;
}

myRequire.cache = Object.create(null);

模塊化的意義

  1. 解決在模塊化出現(xiàn)之前的js依賴混亂,全局污染命名沖突的問題
  2. 模塊化的出現(xiàn)讓js代碼可以拆分為多個模塊共同協(xié)作,單個js文件過長的問題,降低了維護難度。
  3. 模塊化的出現(xiàn)讓js開發(fā)大型項目出現(xiàn)了可能

ps:當(dāng)前內(nèi)容為學(xué)習(xí)commonjs理解,內(nèi)容正確性請謹(jǐn)慎甄別。文章來源地址http://www.zghlxwxcb.cn/news/detail-854939.html

到了這里,關(guān)于commonjs的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 前端10年進化 Node.js、模塊化、CommonJS、AMD、CMD、Webpack、Vue-cli、Electron-vue

    模塊化的概念在軟件開發(fā)領(lǐng)域已經(jīng)存在很長時間,但在?JavaScript?中的模塊化發(fā)展相對較晚。以下是對您提出的問題的回答: 提出時間:JavaScript?中的模塊化概念相對較早地提出于?CommonJS?規(guī)范。CommonJS?是一種?JavaScript?模塊化規(guī)范,最早在?2009?年由?Ryan?Dahl?和其他社區(qū)成

    2024年02月11日
    瀏覽(25)
  • 什么是模塊化?為什么要進行模塊化開發(fā)?

    模塊化是一種軟件開發(fā)的設(shè)計模式,它將一個大型的軟件系統(tǒng)劃分成多個獨立的模塊,每個模塊都有自己的功能和接口,并且能夠與其他模塊獨立地工作。 ?先來一段八股文 模塊化開發(fā)可以帶來以下好處: 提高代碼的復(fù)用性:模塊化可以將代碼劃分成可重用的部分,降低代

    2023年04月12日
    瀏覽(32)
  • 【FPGA/IC】什么是模塊化設(shè)計?

    【FPGA/IC】什么是模塊化設(shè)計?

    FPGA/IC設(shè)計中根據(jù)模塊層次的不同有兩種基本的設(shè)計方法: 自下而上 方法對設(shè)計進行逐次劃分的過程是從基本單元出發(fā)的,設(shè)計樹最末枝上的單元是已經(jīng)設(shè)計好的基本單元,或者其他項目開發(fā)好的單元或者IP。該方法先對底層的功能塊進行分析,然后使用這些模塊來搭建規(guī)模

    2024年03月19日
    瀏覽(31)
  • CommonJs規(guī)范和ES 模塊系統(tǒng)

    CommonJS 是一種模塊化規(guī)范,用于在 JavaScript 應(yīng)用程序中組織和管理代碼的模塊。它定義了模塊的導(dǎo)入和導(dǎo)出機制,使得開發(fā)者可以將代碼分割成可復(fù)用的模塊,并在不同的文件中引用和使用這些模塊。 CommonJS 規(guī)范有以下幾個主要 特點 和 用途 : 模塊化組織代碼 :CommonJS 允許

    2024年02月12日
    瀏覽(23)
  • 008Node.js模塊、自定義模塊和CommonJs

    008Node.js模塊、自定義模塊和CommonJs

    CommonJS API定義很多普通應(yīng)用程序(主要指非瀏覽器的應(yīng)用)使用的API,從而填補了這個空白。它的終極目標(biāo)是提供一個類似Python,Ruby和Java標(biāo) 準(zhǔn)庫。這樣的話,開發(fā)者可以使用CommonJS API編寫應(yīng)用程序,然后這些應(yīng)用可以運行在不同的JavaScript解釋器和不同的主機環(huán)境中。在兼容

    2024年04月13日
    瀏覽(22)
  • 如何在Vue中進行單元測試?什么是Vue的模塊化開發(fā)?

    在Vue中進行單元測試可以提高代碼的可維護性和可讀性,同時也能夠幫助開發(fā)者更快地找到代碼中的問題和潛在的錯誤。下面是一些在Vue中進行單元測試的步驟: 安裝單元測試工具 首先需要安裝一個單元測試工具,例如Jest或Mocha。可以使用npm或yarn進行安裝。 創(chuàng)建測試文件

    2024年02月12日
    瀏覽(25)
  • 【ES6】CommonJS模塊和ES6模塊

    在JavaScript中,模塊是一種將功能代碼組織成邏輯單元的方式,以便在其他項目中重復(fù)使用。有兩種主要的模塊系統(tǒng):CommonJS和ES6。 1、CommonJS 在CommonJS中,我們使用require來引入模塊,使用module.exports來導(dǎo)出模塊。 下面是一個簡單的例子: 然后,在另一個文件中,我們可以使用

    2024年02月09日
    瀏覽(85)
  • 前端面試:【前端工程化】CommonJS 與 ES6 模塊

    嗨,親愛的前端開發(fā)者!在現(xiàn)代Web開發(fā)中,模塊化是構(gòu)建可維護和可擴展應(yīng)用程序的關(guān)鍵。本文將深入探討兩種主要的JavaScript模塊系統(tǒng):CommonJS 和 ES6 模塊,以幫助你了解它們的工作原理、用法以及如何選擇合適的模塊系統(tǒng)。 1. CommonJS: 用途: CommonJS 是一種模塊系統(tǒng),最初

    2024年02月11日
    瀏覽(103)
  • 模塊化與單片化優(yōu)缺點解析:為什么單片鏈仍是 DeFi 協(xié)議的最好選擇?

    目前模塊化區(qū)塊鏈熱度不減,其誕生的原因源自于單片鏈的局限和缺陷。? 什么是」模塊化「? 在軟件工程開發(fā)中,」模塊化「是指將代碼進行解耦, 使每個模塊的功能獨立, 模塊之間的耦合程度低, 達到模塊復(fù)用的目的。? 模塊化的本質(zhì)是一種任務(wù)分工,不同的模塊組合成的程

    2023年04月09日
    瀏覽(22)
  • CommonJS 和 ES6 Module:一場模塊規(guī)范的對決(上)

    CommonJS 和 ES6 Module:一場模塊規(guī)范的對決(上)

    ?? 前端開發(fā)工程師(主業(yè))、技術(shù)博主(副業(yè))、已過CET6 ?? 阿珊和她的貓_CSDN個人主頁 ?? ??透呒墝n}作者、在??痛蛟旄哔|(zhì)量專欄《前端面試必備》 ?? 藍橋云課簽約作者、已在藍橋云課上架的前后端實戰(zhàn)課程《Vue.js 和 Egg.js 開發(fā)企業(yè)級健康管理項目》、《帶你從入

    2024年01月23日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包