typescript - 在 @angular 或 @types 中,‘@’ 符號背後是什麼?
我正在試著理解當我看到如下的 import 語句時,‘@’ 符號背後的含義:
Import { Injectable } from ‘@angular/core’;
或者像下面這樣的 npm cli 命令:
npm -install -save @types/lodash
這些語句或命令對我來說運作良好,我只是想了解 @ 符號背後發生了什麼。
這個 ''@'' 是 TypeScript 的特性嗎?還是 NPM 的東西?
提供一個深入的線上文件指引會非常有幫助。
答案#1
這是一個 NPM 的東西,稱為 scoped packages。這是官方文件:
作用域就像 npm 模組的命名空間。如果一個套件的名稱以 @ 開頭,那麼它就是一個有作用域的套件。作用域是 @ 和斜線之間的所有內容。
所有帶範圍的套件都儲存在以 @ 開頭的資料夾內。例如,所有 Angular 套件都儲存在 node_modules 中的 @angular 資料夾內,而如果沒有 @ 範圍識別符,並且你使用 angular/core 和 angular/compiler,那麼每個套件都會有各自的資料夾。@types 套件的情況也相同。
TypeScript 的 import 語句如何識別或整合 '@'?
由 node 使用的 require 函數如果在路徑中使用正斜線,可以遍歷 node_modules 資料夾,並且不限於作用域套件:
node_modules
a
b
index.js
module.exports = 3;
m.js
console.log(require('a/b')); // logs 3
Typescript 編譯器在底層使用 Node 的 statSync 函數來檢查資料夾:
function fileSystemEntryExists(path, entryKind) {
try {
var stat = _fs.statSync(path);
switch (entryKind) {
case 0 /* File */: return stat.isFile();
case 1 /* Directory */: return stat.isDirectory();
}
}
catch (e) {
return false;
}
}
而且自然地,這個函數將斜線視為路徑分隔符。當解析路徑時,如果設置了 NODE 模組解析策略,TypeScript 編譯器會在路徑前加上 node_modules。
答案#2
這是一個 NPM 功能,稱為範圍套件。
簡言之,這是一個組織功能,允許組織將其所有套件歸類在一個官方標識下。根據官方文件:
範圍是一種將相關套件分組的方法,也會影響 npm 處理套件的某些方式。
每個 npm 使用者/組織都有自己的範圍,只有你可以在你的範圍內添加套件。這意味著你不必擔心有人搶先使用你的套件名稱。因此,這也是為組織標示官方套件的一種好方法。
在 NPM 處理作用域套件的方式中有一些小調整,例如,在 node_modules 中,會為一個作用域創建一個目錄,並將該作用域的所有套件存放在該目錄中。不過在幾乎所有情況下,你可以將作用域套件視為與非作用域套件相同的方式處理。
