commonjs的核心思想(commonjs語法)

本文目錄一覽:

工程化屬於技術研發階段的哪一個階段?

前端工程本質上是軟體工程的一種。軟體工程化關注的是性能、穩定性、可用性、可維護性等方面,注重基本的開發效率、運行效率的同時,思考維護效率。一切以這些為目標的工作都是’前端工程化’。工程化是一種思想而不是某種技術。

前端工程化需要考慮哪些因素?

1. 模塊化

簡單來說,模塊化就是將一個大文件拆分成相互依賴的小文件,再進行統一的拼裝和載入。(方便了多人協作)。

分而治之是軟體工程中的重要思想,是複雜系統開發和維護的基石,這點放在前端開發中同樣適用。模塊化是目前前端最流行的分治手段。

模塊化開發的最大價值應該是分治!

不管你將來是否要復用某段代碼,你都有充分的理由將其分治為一個模塊。

JS模塊化方案

AMD/CommonJS/UMD/ES6 Module等等。

CommonJS的核心思想是把一個文件當做一個模塊,要在哪裡使用這個模塊,就在哪裡require這個模塊,然後require方法開始載入這個模塊並且執行其中的代碼,最後會返回你指定的export對象。

如何正確理解javascript的模塊化

模塊化在項目中十分的重要,一個複雜的項目肯定有很多相似的功能模塊,如果每次都需要重新編寫模塊肯定既費時又耗力。但是引用別人編寫模塊的前提是要有統一的「打開姿勢」,如果每個人有各自的寫法,那麼肯定會亂套,下面介紹幾種JS的模塊化的規範。

一:模塊化進程一:script標籤

這是最原始的 JavaScript 文件載入方式,如果把每一個文件看做是一個模塊,那麼他們的介面通常是暴露在全局作用域下,也就是定義在 window 對象中,不同模塊的介面調用都是一個作用域中,一些複雜的框架,會使用命名空間的概念來組織這些模塊的介面。

缺點:

1、污染全局作用域

2、開發人員必須主觀解決模塊和代碼庫的依賴關係

3、文件只能按照script標籤的書寫順序進行載入

4、在大型項目中各種資源難以管理,長期積累的問題導致代碼庫混亂不堪

二:模塊化進程二:CommonJS規範

該規範的核心思想是允許模塊通過require方法來同步載入所要依賴的其他模塊,然後通過 exports 或 module.exports 來導出需要暴露的介面。

require(“module”);

require(“../file.js”);

exports.doStuff = function(){};

module.exports = someValue;

優點:

1、簡單並容易使用

2、伺服器端模塊便於重用

缺點:

1、同步的模塊載入方式不適合在瀏覽器環境中,同步意味著阻塞載入,瀏覽器資源是非同步載入的

2、不能非阻塞的並行載入多個模塊

module.exports與exports的區別

1、exports 是指向的 module.exports 的引用

2、module.exports 初始值為一個空對象 {},所以 exports 初始值也是 {}

3、require() 返回的是 module.exports 而不是 exports

exports示例:

// app.js

var circle = require(‘./circle’);

console.log(circle.area(4));

// circle.js

exports.area = function(r){

return r * r * Math.PI;

}

module.exports示例:

// app.js

var area = require(‘./area’);

console.log(area(4));

// area.js

module.exports = function(r){

return r * r * Math.PI;

}

錯誤的情況:

// app.js

var area = require(‘./area’);

console.log(area(4));

// area.js

exports = function(r){

return r * r * Math.PI;

}

其實是對 exports 進行了覆蓋,也就是說 exports 指向了一塊新的內存(內容為一個計算圓面積的函數),也就是說 exports 和 module.exports 不再指向同一塊內存,也就是說此時 exports 和 module.exports 毫無聯繫,也就是說 module.exports 指向的那塊內存並沒有做任何改變,仍然為一個空對象{},也就是說area.js導出了一個空對象,所以我們在 app.js 中調用 area(4) 會報 TypeError: object is not a function 的錯誤。

總結:當我們想讓模塊導出的是一個對象時, exports 和 module.exports 均可使用(但 exports 也不能重新覆蓋為一個新的對象),而當我們想導出非對象介面時,就必須也只能覆蓋 module.exports 。

三:模塊化進程三:AMD規範

由於瀏覽器端的模塊不能採用同步的方式載入,會影響後續模塊的載入執行,因此AMD(Asynchronous Module Definition非同步模塊定義)規範誕生了。

AMD標準中定義了以下兩個API

1、require([module], callback);

2、define(id, [depends], callback);

require介面用來載入一系列模塊,define介面用來定義並暴露一個模塊。

示例:

define(“module”, [“dep1”, “dep2”], function(d1, d2){

return someExportedValue;

});

require([“module”, “../file”], function(module, file){ /* … */ });

優點:

1、適合在瀏覽器環境中非同步載入模塊

2、可以並行載入多個模塊

缺點:

1、提高了開發成本,代碼的閱讀和書寫比較困難,模塊定義方式的語義不順暢

2、不符合通用的模塊化思維方式,是一種妥協的實現

四:模塊化進程四:CMD規範

CMD(Common Module Definition)規範和AMD很相似,盡量保持簡單,並與CommonJS和Node.js的 Modules 規範保持了很大的兼容性。在CMD規範中,一個模塊就是一個文件。

示例:

define(function(require, exports, module){

var $ = require(‘jquery’);

var Spinning = require(‘./spinning’);

exports.doSomething = …

module.exports = …

})

優點:

1、依賴就近,延遲執行

2、可以很容易在 Node.js 中運行

缺點:

1、依賴 SPM 打包,模塊的載入邏輯偏重

AMD和CMD的區別

AMD和CMD起來很相似,但是還是有一些細微的差別,讓我們來看一下他們的區別在哪裡:

1、對於依賴的模塊,AMD是提前執行,CMD是延遲執行。

2、AMD推崇依賴前置;CMD推崇依賴就近,只有在用到某個模塊的時候再去require。看代碼:

// AMD

define([‘./a’, ‘./b’], function(a, b){ // 依賴必須一開始就寫好

a.doSomething()

// 此處略去 100 行

b.doSomething()

});

// CMD

define(function(require, exports, module){

var a = require(‘./a’)

a.doSomething()

// 此處略去 100 行

var b = require(‘./b’)

// 依賴可以就近書寫

b.doSomething()

// …

});

3、AMD 的 API 默認是一個當多個用,CMD 的 API 嚴格區分,推崇職責單一。

五:模塊化進程五:ES6模塊化

EcmaScript6標準增加了JavaScript語言層面的模塊體系定義。ES6 模塊的設計思想,是盡量的靜態化,使得編譯時就能確定模塊的依賴關係,以及輸入和輸出的變數。CommonJS和AMD模塊,都只能在運行時確定這些東西。

在 ES6 中,我們使用export關鍵字來導出模塊,使用import關鍵字引用模塊。需要說明的是,ES6的這套標準和目前的標準沒有直接關係,目前也很少有JS引擎能直接支持。因此Babel的做法實際上是將不被支持的import翻譯成目前已被支持的require。

儘管目前使用import和require的區別不大(本質上是一回事),但依然強烈推薦使用import關鍵字,因為一旦JS引擎能夠解析ES6的import關鍵字,整個實現方式就會和目前發生比較大的變化。如果目前就開始使用import關鍵字,將來代碼的改動會非常小。

示例:

import “jquery”;

export functiondoStuff(){}

module “localModule” {}

優點:

1、容易進行靜態分析

2、面向未來的 EcmaScript 標準

缺點:

1、原生瀏覽器端還沒有實現該標準

2、全新的命令字,新版的 Node.js才支持

簡述什麼是commonjs,以及其與nodejs的關係

自從CommonJS和NodeJS兩個項目的出現,JavaScript作為本地編程語言的這種特殊應用形式,才開始進入進入大眾的視野。

說明什麼是CommonJS。 另外隨著並行計算的普及,像JavaScript這種函數式語言,由於其固有的易於進行並行計算的特性,將有更廣闊的應用前景。

工程化是什麼

前端工程本質上是軟體工程的一種。軟體工程化關注的是性能、穩定性、可用性、可維護性等方面,注重基本的開發效率、運行效率的同時,思考維護效率。一切以這些為目標的工作都是’前端工程化’。工程化是一種思想而不是某種技術。

前端工程化需要考慮哪些因素?

1. 模塊化

簡單來說,模塊化就是將一個大文件拆分成相互依賴的小文件,再進行統一的拼裝和載入。(方便了多人協作)。

分而治之是軟體工程中的重要思想,是複雜系統開發和維護的基石,這點放在前端開發中同樣適用。模塊化是目前前端最流行的分治手段。

模塊化開發的最大價值應該是分治!

不管你將來是否要復用某段代碼,你都有充分的理由將其分治為一個模塊。

JS模塊化方案

AMD/CommonJS/UMD/ES6 Module等等。

CommonJS的核心思想是把一個文件當做一個模塊,要在哪裡使用這個模塊,就在哪裡require這個模塊,然後require方法開始載入這個模塊並且執行其中的代碼,最後會返回你指定的export對象。

module.export = function() { hello: function() { alert(‘你好’); }}var a = require(‘./xxx/a.js’);a.hello(); // == 彈窗「你好」

CommonJS 載入模塊是同步的,所以只有載入完成才能執行後面的操作,不能非阻塞的並行載入多個模塊。

AMD(非同步模塊定義,Asynchronous Module Definition),特點是可以實現非同步載入模塊,等所有模塊都載入並且解釋執行完成後,才會執行接下來的代碼。

// 通過AMD載入模塊// define(// module_id /*可選*/, // [dependencies] 可選, // definition function /*回調 用來初始化模塊或對象的函數*/// );define([‘myModule’, ‘myOtherModule’], function(myModule, myOtherModule) { console.log(myModule.hello()); //會先並行載入所有的模塊a b 並執行其中模塊的代碼後,在執行逐步執行下面的 console require(‘a’); console.log(‘a required’); require(‘b’); console.log(‘b required’); console.log(‘all modules have been required’);});

在一些同時需要AMD和CommonJS功能的項目中,你需要使用另一種規範:Universal Module Definition(通用模塊定義規範)。UMD創造了一種同時使用兩種規範的方法,並且也支持全局變數定義。所以UMD的模塊可以同時在客戶端和服務端使用。

幸運的是在JS的最新規範ECMAScript 6 (ES6)中,引入了模塊功能。

ES6 的模塊功能汲取了CommonJS 和 AMD 的優點,擁有簡潔的語法並支持非同步載入,並且還有其他諸多更好的支持(例如導入是實時只讀的。(CommonJS 只是相當於把導出的代碼複製過來))。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/286491.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-23 03:47
下一篇 2024-12-23 03:47

相關推薦

  • Python語法大全解析

    本文旨在全面闡述Python語法,並提供相關代碼示例,幫助讀者更好地理解Python語言。 一、基礎語法 1、Python的注釋方式 # 這是單行注釋 “”” 這是多行注釋,可以注…

    編程 2025-04-29
  • Python中複數的語法

    本文將從多個方面對Python中複數的語法進行詳細的闡述。Python中的複數是指具有實部和虛部的數,其中實部和虛部都是浮點數。它們可以用「實數+虛數j」的形式表示。例如,3 + …

    編程 2025-04-29
  • parent.$.dialog是什麼技術的語法

    parent.$.dialog是一種基於jQuery插件的彈出式對話框技術,它提供了一個方便快捷的方式來創建各種類型和樣式的彈出式對話框。它是對於在網站開發中常見的彈窗、提示框等交…

    編程 2025-04-28
  • Think-ORM數據模型及資料庫核心操作

    本文主要介紹Think-ORM數據模型建立和資料庫核心操作。 一、模型定義 Think-ORM是一個開源的ORM框架,用於簡化在PHP應用中(特別是ThinkPHP)與關係資料庫之…

    編程 2025-04-27
  • 編譯原理語法分析思維導圖

    本文將從以下幾個方面詳細闡述編譯原理語法分析思維導圖: 一、語法分析介紹 1.1 語法分析的定義 語法分析是編譯器中將輸入的字元流轉換成抽象語法樹的一個過程。該過程的目的是確保輸入…

    編程 2025-04-27
  • Python進階語法全面解析

    Python語言作為一種廣泛應用於人工智慧、數據分析、雲計算等多個領域的編程語言,擁有廣泛的社區和強大的生態系統。Python提供了基本語法以及常用函數和模塊,用於解決大量常規編程…

    編程 2025-04-27
  • 《Windows核心編程第7版》綜述

    一、Windows核心編程第7版pdf 《Windows核心編程第7版》是由Jeffrey Richter和Christophe Nasarre共同編寫的Windows編程書籍,出…

    編程 2025-04-25
  • LL(1)語法分析器:從語法規則到語法樹

    在編譯原理中,語法分析是編譯器的一個重要階段。語法分析器的作用是將代碼轉換成語法樹,以便後續階段進行處理。LL(1)語法分析器是語法分析器的一種,它採用的是自頂向下的分析方法,可以…

    編程 2025-04-25
  • 媒體查詢CSS:響應式設計的核心

    一、什麼是媒體查詢CSS? 媒體查詢是CSS3中引入的一種特性,它允許我們針對不同的設備和屏幕尺寸編寫不同的樣式規則。它可以判斷用戶使用的設備特性和瀏覽器窗口大小,並針對性地載入不…

    編程 2025-04-24
  • 深入分析Java Foreach語法

    一、Foreach介紹 Java的Foreach語法是一種迭代語法,被廣泛應用於遍曆數組或集合。其優點是在代碼數量和可讀性方面均佔有優勢,不需要額外定義計數器等變數,便可輕鬆遍歷集…

    編程 2025-04-24

發表回復

登錄後才能評論