模組路徑解析規則
有經驗的 C 程式設計師在編寫一個新程式時首先從 make 檔案寫起。同樣的,使用 NodeJS 編寫程式前,為了有個良好的開端,首先需要準備好程式碼的目錄結構和部署方式,就如同修房子要先搭鷹架。本章將介紹與之相關的各種知識。
模組路徑解析規則
我們已經知道,require函數支援斜線(/)或盤符(C:)開頭的絕對路徑,也支援./開頭的相對路徑。但這兩種路徑在模組之間建立了強耦合關係,一旦某個模組檔案的存放位置需要變更,使用該模組的其它模組的程式碼也需要跟著調整,變得牽一發動全身。因此,require函數支援第三種形式的路徑,寫法類似foo/bar,並依序依照下列規則解析路徑,直到找到模組位置。
內建模組
如果傳遞給 require 函數的是 NodeJS 內建模組名稱,不做路徑解析,直接傳回內部模組的導出對象,例如 require('fs')。
node_modules 目錄
NodeJS 定義了一個特殊的 node_modules 目錄來存放模組。例如某個模組的絕對路徑是 /home/user/hello.js,在該模組中使用 require('foo/bar') 方式載入模組時,則 NodeJS 依序嘗試使用以下路徑。
/home/user/node_modules/foo/bar /home/node_modules/foo/bar /node_modules/foo/bar
NODE_PATH 環境變數
與 PATH 環境變數類似,NodeJS 允許透過 NODE_PATH 環境變數來指定額外的模組搜尋路徑。 NODE_PATH 環境變數中包含一到多個目錄路徑,路徑之間在 Linux 下使用:分隔,在 Windows 下使用;分隔。例如定義了以下 NODE_PATH 環境變數:
NODE_PATH=/home/user/lib:/home/lib
當使用 require('foo/bar')的方式載入模組時,則 NodeJS 依序嘗試以下路徑。
/home/user/lib/foo/bar /home/lib/foo/bar
包
我們已經知道了 JS 模組的基本單位是單一 JS 文件,但複雜些的模組往往由多個子模組組成。為了方便管理和使用,我們可以把由多個子模組組成的大模組稱做包,並把所有子模組放在同一個目錄裡。
在組成一個套件的所有子模組中,需要有一個入口模組,入口模組的導出物件被當作包的導出物件。例如有以下目錄結構。
- /home/user/lib/ - cat/ head.js body.js main.js
其中 cat 目錄定義了一個包,其中包含了 3 個子模組。 main.js 作為入口模組,內容如下:
var head = require('./head'); var body = require('./body'); exports.create = function (name) { return { name: name, head: head.create(), body: body.create() }; };
在其它模組裡使用包的時候,需要載入包的入口模組。接著上例,使用 require('/home/user/lib/cat/main')能達到目的,但是入口模組名稱出現在路徑裡看上去不是個好主意。因此我們需要做點額外的工作,讓包包使用起來更像是單一模組。
index.js
當模組的檔名是 index.js,載入模組時可以使用模組所在目錄的路徑代替模組檔路徑,因此接著上例,以下兩條語句等價。
var cat = require('/home/user/lib/cat'); var cat = require('/home/user/lib/cat/index');
這樣處理後,只需要把包目錄路徑傳遞給 require 函數,感覺上整個目錄被當作單一模組使用,更有整體感。
package.json
如果想要自訂入口模組的檔案名稱和存放位置,就需要在套件目錄下包含一個 package.json 文件,並在其中指定入口模組的路徑。上例中的 cat 模組可以重構如下。
- /home/user/lib/ - cat/ + doc/ - lib/ head.js body.js main.js + tests/ package.json
其中package.json內容如下。
{ "name": "cat", "main": "./lib/main.js" }
如此一來,就同樣可以使用 require('/home/user/lib/cat')的方式載入模組。 NodeJS 會根據套件目錄下的 package.json 找到入口模組所在位置。

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SublimeText3漢化版
中文版,非常好用

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具