網站搜尋

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 中,會為一個作用域創建一個目錄,並將該作用域的所有套件存放在該目錄中。不過在幾乎所有情況下,你可以將作用域套件視為與非作用域套件相同的方式處理。