最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

談?wù)刵ode.js中的模塊系統(tǒng)

 更新時(shí)間:2020年09月01日 11:47:51   作者:謙行  
這篇文章主要介紹了node.js中的模塊系統(tǒng),幫助大家更好的理解和學(xué)習(xí)node.js框架,感興趣的朋友可以了解下

Node.js 的模塊

JavaScript 做為一門(mén)為網(wǎng)頁(yè)添加交互功能的簡(jiǎn)單腳本語(yǔ)言問(wèn)世,在誕生時(shí)并不包含模塊系統(tǒng),隨著 JavaScript 解決問(wèn)題越來(lái)越復(fù)雜,把所有代碼寫(xiě)在一個(gè)文件內(nèi),用 function 區(qū)分功能單元已經(jīng)不能支撐復(fù)雜應(yīng)用開(kāi)發(fā)了,ES6 帶來(lái)了大部分高級(jí)語(yǔ)言都有的 class 和 module,方便開(kāi)發(fā)者組織代碼

import _ from 'lodash';

class Fun {}

export default Fun;

上面三行代碼展示了一個(gè)模塊系統(tǒng)最重要的兩個(gè)要素 import 和 export
1. export用于規(guī)定模塊的對(duì)外接口
2. import用于輸入其他模塊提供的功能

而在 ES6 之前,社區(qū)出現(xiàn)了很多模塊加載方案,最主要的有 CommonJS 和 AMD 兩種,Node.js 誕生早于 ES6,模塊系統(tǒng)使用的是類似 CommonJS 的實(shí)現(xiàn),遵從幾個(gè)原則

1. 一個(gè)文件是一個(gè)模塊,文件內(nèi)的變量作用域都在模塊內(nèi)
2. 使用 module.exports 對(duì)象導(dǎo)出模塊對(duì)外接口
3. 使用 require 引入其它模塊

circle.js

const { PI } = Math;

module.exports = function area(r) {
 PI * r ** 2;
};

上面代碼就實(shí)現(xiàn)了 Node.js 的一個(gè)模塊,模塊沒(méi)有依賴其它模塊,導(dǎo)出了方法 area 計(jì)算圓的面積

test.js

const area = require('./circle.js');
console.log(`半徑為 4 的圓的面積是 ${area(4)}`);

模塊依賴了 circle.js,使用其對(duì)外暴露的 area 方法,計(jì)算圓的面積

module.exports

模塊對(duì)外暴露接口使用 module.exports,常見(jiàn)的有兩種用法:為其添加屬性或賦值到新對(duì)象

test.js

// 添加屬性
module.exports.prop1 = xxx;
module.exports.funA = xxx;
module.exports.funB = xxx;

// 賦值到全新對(duì)象
module.exports = {
 prop1,
 funA,
 funB,
};

兩種寫(xiě)法是等價(jià)的,使用時(shí)候沒(méi)區(qū)別

const mod = require('./test.js');

console.log(mod.prop1);
console.log(mod.funA());

還有另外一種直接使用 exports 對(duì)象的方法,但是只能對(duì)其添加屬性,不能賦值到新對(duì)象,后面會(huì)介紹原因

// 正確的寫(xiě)法:添加屬性
exports.prop1 = xxx;
exports.funA = xxx;
exports.funB = xxx;

// 賦值到全新對(duì)象
module.exports = {
 prop1,
	funA,
 funB,
};

require('id')

模塊類型

require 用法比較簡(jiǎn)單,id 支持模塊名和文件路徑兩種類型

模塊名

const fs = require('fs');
const _ = require('lodash');

示例中的 fs、lodash 都是模塊名,fs 是 Node.js 內(nèi)置的核心模塊,lodash 是通過(guò) npm 安裝到 node_modules 下的第三方模塊,如果出現(xiàn)重名,優(yōu)先使用系統(tǒng)內(nèi)置模塊

因?yàn)橐粋€(gè)項(xiàng)目?jī)?nèi)可能會(huì)包含多個(gè) node_modules 文件夾(Node.js 比較失敗的設(shè)計(jì)),第三方模塊查找過(guò)程會(huì)遵循就近原則逐層上溯(可以在程序中打印 module.paths 查看具體查找路徑),直到根據(jù) NODE_PATH 環(huán)境變量查找到文件系統(tǒng)根目錄,具體過(guò)程可以參考官方文檔

此外,Node.js 還會(huì)搜索以下的全局目錄列表:

  • $HOME/.node_modules
  • $HOME/.node_libraries
  • $PREFIX/lib/node

其中 $HOME 是用戶的主目錄, $PREFIX 是 Node.js 里配置的 node_prefix。強(qiáng)烈建議將所有的依賴放在本地的 node_modules 目錄,這樣將會(huì)更快地加載,且更可靠

文件路徑

模塊還可以可以使用文件路徑加載,這是項(xiàng)目?jī)?nèi)自定義模塊的通用加載方式,路徑可以省略拓展名,會(huì)按照 .js、.json、.node 順序嘗試

  • 以 '/' 為前綴的模塊是文件的絕對(duì)路徑,按照系統(tǒng)路徑查找模塊
  • 以 './' 為前綴的模塊是相對(duì)于當(dāng)前調(diào)用 require 方法的文件,不受后續(xù)模塊在哪里被使用到影響

單次加載 & 循環(huán)依賴

模塊在第一次加載后會(huì)被緩存到 Module._cache ,如果每次調(diào)用 require('foo') 都解析到同一文件,則返回相同的對(duì)象,同時(shí)多次調(diào)用 require(foo) 不會(huì)導(dǎo)致模塊的代碼被執(zhí)行多次。 Node.js 根據(jù)實(shí)際的文件名緩存模塊,因此從不同層級(jí)目錄引用相同模塊不會(huì)重復(fù)加載。

理解的模塊單次加載機(jī)制方便我們理解模塊循環(huán)依賴后的現(xiàn)象

a.js

console.log('a 開(kāi)始');
exports.done = false;
const b = require('./b.js');
console.log('在 a 中,b.done = %j', b.done);
exports.done = true;
console.log('a 結(jié)束');

b.js

console.log('b 開(kāi)始');
exports.done = false;
const a = require('./a.js');
console.log('在 b 中,a.done = %j', a.done);
exports.done = true;
console.log('b 結(jié)束');

main.js

console.log('main 開(kāi)始');
const a = require('./a.js');
const b = require('./b.js');
console.log('在 main 中,a.done=%j,b.done=%j', a.done, b.done);

當(dāng) main.js 加載 a.js 時(shí),a.js 又加載 b.js,此時(shí),b.js 會(huì)嘗試去加載 a.js

為了防止無(wú)限的循環(huán)會(huì)返回一個(gè) a.js 的 exports 對(duì)象的 未完成的副本 給 b.js 模塊,然后 b.js 完成加載,并將 exports 對(duì)象提供給 a.js 模塊

因此示例的輸出是

main 開(kāi)始
a 開(kāi)始
b 開(kāi)始
在 b 中,a.done = false
b 結(jié)束
在 a 中,b.done = true
a 結(jié)束
在 main 中,a.done=true,b.done=true

看不懂上面的過(guò)程也沒(méi)關(guān)系,日常工作根本用不到,即使看懂了也不要在項(xiàng)目中使用循環(huán)依賴!

工作原理

Node.js 每個(gè)文件都是一個(gè)模塊,模塊內(nèi)的變量都是局部變量,不會(huì)污染全局變量,在執(zhí)行模塊代碼之前,Node.js 會(huì)使用一個(gè)如下的函數(shù)封裝器將模塊封裝

(function(exports, require, module, __filename, __dirname) {
	// 模塊的代碼實(shí)際上在這里
});
  • __filename:當(dāng)前模塊文件的絕對(duì)路徑
  • __dirname:當(dāng)前模塊文件據(jù)所在目錄的絕對(duì)路徑
  • module:當(dāng)前的模塊實(shí)例
  • require:加載其它模塊的方法,module.require 的快捷方式
  • exports:導(dǎo)出模塊接口的對(duì)象,module.exports 的快捷方式

回頭看看最開(kāi)始的問(wèn)題,為什么 exports 對(duì)象不支持賦值為其它對(duì)象?把上面函數(shù)添加一句 exports 對(duì)象來(lái)源就很簡(jiǎn)單了

const exports = module.exports;
(function(exports, require, module, __filename, __dirname) {
	// 模塊的代碼實(shí)際上在這里
});

其它模塊 require 到的肯定是模塊的 module.exports 對(duì)象,如果吧 exports 對(duì)象賦值給其它對(duì)象,就和 module.exports 對(duì)象斷開(kāi)了連接,自然就沒(méi)用了

在 Node.js 中使用 ES Module

隨著 ES6 使用越來(lái)越廣泛,Node.js 也支持了 ES6 Module,有幾種方法

babel 構(gòu)建

使用 babel 構(gòu)建是在 v12 之前版本最簡(jiǎn)單、通用的方式,具體配置參考 @babel/preset-env

.babelrc

{
 "presets": [
  ["@babel/preset-env", {
   "targets": {
    "node": "8.9.0",
    "esmodules": true
   }   
  }]
 ]
}

原生支持

在 v12 后可以使用原生方式支持 ES Module

  1. 開(kāi)啟 --experimental-modules
  2. 模塊名修改為 .mjs (強(qiáng)烈不推薦使用)或者 package.json 中設(shè)置 "type": module

這樣 Node.js 會(huì)把 js 文件都當(dāng)做 ES Module 來(lái)處理,更多詳情參考官方文檔

以上就是談?wù)刵ode.js中的模塊系統(tǒng)的詳細(xì)內(nèi)容,更多關(guān)于node.js 模塊的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 小結(jié)Node.js中非阻塞IO和事件循環(huán)

    小結(jié)Node.js中非阻塞IO和事件循環(huán)

    本文針對(duì)在Node.js關(guān)鍵的兩個(gè)概念:非阻塞IO和事件循環(huán)進(jìn)行了適當(dāng)?shù)目偨Y(jié),需要的朋友可以參考下
    2014-09-09
  • nodejs?express路由匹配控制及Router模塊化使用詳解

    nodejs?express路由匹配控制及Router模塊化使用詳解

    這篇文章主要為大家介紹了nodejs?express路由匹配控制及Router模塊化使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 快速使用node.js進(jìn)行web開(kāi)發(fā)詳解

    快速使用node.js進(jìn)行web開(kāi)發(fā)詳解

    本篇文章主要介紹了快速使用node.js進(jìn)行web開(kāi)發(fā)詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • 詳解nodejs中的異步迭代器

    詳解nodejs中的異步迭代器

    這篇文章主要介紹了nodejs中的異步迭代器,對(duì)異步感興趣的同學(xué),可以參考下
    2021-05-05
  • 在CentOS 7服務(wù)器上安裝Node.js的方法步驟

    在CentOS 7服務(wù)器上安裝Node.js的方法步驟

    Node.js 是一個(gè)用于服務(wù)器端編程的 JavaScript 平臺(tái),允許用戶快速構(gòu)建網(wǎng)絡(luò)應(yīng)用程序,通過(guò)在前端和后端都使用 JavaScript,開(kāi)發(fā)可以更加一致并且可以在同一個(gè)系統(tǒng)中設(shè)計(jì),在本指南中,我們將向您展示如何在 Ubuntu 14.04 服務(wù)器上開(kāi)始使用 Node.js
    2024-09-09
  • nodejs實(shí)現(xiàn)生成文件并在前端下載

    nodejs實(shí)現(xiàn)生成文件并在前端下載

    這篇文章主要介紹了nodejs實(shí)現(xiàn)生成文件并在前端下載,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Windows系統(tǒng)下Node.js安裝以及環(huán)境配置的完美教程

    Windows系統(tǒng)下Node.js安裝以及環(huán)境配置的完美教程

    相信對(duì)于很多關(guān)注javascript發(fā)展的同學(xué)來(lái)說(shuō),nodejs已經(jīng)不是一個(gè)陌生的詞眼,下面這篇文章主要給大家介紹了關(guān)于Windows系統(tǒng)下Node.js安裝以及環(huán)境配置的完美教程,需要的朋友可以參考下
    2022-06-06
  • Nodejs實(shí)現(xiàn)批量修改圖片尺寸工具

    Nodejs實(shí)現(xiàn)批量修改圖片尺寸工具

    本文主要為大家介紹了一個(gè)Node.js工具,可以通過(guò)簡(jiǎn)單的命令行操作,允許用戶批量調(diào)整圖片尺寸,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-10-10
  • Node.js模塊化的使用詳細(xì)介紹

    Node.js模塊化的使用詳細(xì)介紹

    nodejs中的模塊化是指將每個(gè)js文件會(huì)被認(rèn)為單獨(dú)一個(gè)的模塊。模塊之間是互相不可見(jiàn)的。如果一個(gè)模塊需要使用另一個(gè)模塊,那么需要通過(guò)指定語(yǔ)法來(lái)引入要使用的模塊,而且只能使用引入模塊所暴露的內(nèi)容
    2022-08-08
  • node.js中的console.trace方法使用說(shuō)明

    node.js中的console.trace方法使用說(shuō)明

    這篇文章主要介紹了node.js中的console.trace方法使用說(shuō)明,本文介紹了console.trace的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12

最新評(píng)論

晋江市| 金溪县| 民权县| 合江县| 定西市| 新竹市| 连平县| 南通市| 佛学| 汉源县| 辉县市| 沅江市| 桂东县| 渑池县| 孟连| 日土县| 邵阳县| 敖汉旗| 蓬溪县| 穆棱市| 屏山县| 彩票| 安阳市| 武山县| 扶风县| 沅陵县| 内丘县| 五华县| 斗六市| 桓台县| 靖边县| 临澧县| 曲靖市| 巴彦淖尔市| 安岳县| 巫溪县| 运城市| 莒南县| 那坡县| 喜德县| 长武县|