2022-08-06|閱讀時間 ‧ 約 5 分鐘

介紹最新的 npm Dependency Selector Syntax(相依套件的選擇器語法)

Introducing the new npm Dependency Selector Syntax | GitHub Changelog
Engineering-Security.png (1200×630) (github.blog)
Engineering-Security.png (1200×630) (github.blog)
`npm query` 是從 npm v8.16.0 開始最新的指令, 他接收一個 Dependency Selector(如同在 Dependency Selector Syntax Specification 所定義的) 然後回傳一個從你的專案的 dependencies 篩選過後的 JSON Array 或 NodeList. 我們相信這個能力就是這個套件管理生態裡缺少的一角; 有了他的介紹, 我們希望可以將開發者的潛力解鎖, 捫心自問關於套件的 dependencies, 之間的關係和相關的 metadata.
大部分的 JavaScript 開發者, Dependency Selector Syntax 看起來熟悉, 因為他確實是採用 CSS 的形式. 我們取用了現存的, 已知的語言, 以及他的 operators 讓不同的套件資訊廣泛存取.

範例使用方式

如果我要列出所有的 dependencies(與 `npm list --all` 類似), 我可以執行:
npm query "*"
如果我要找出專案內每個 `react` 和 `lodash` 的版本, 我可以執行:
npm query "#react, #lodash"
如果我要找出所有 `react` 版本, 但並非定義在 peer dependency, 我可以執行:
npm query "#react:not(.peer)"
如果我要找出所有專案內的 dependencies, 且使用 `MIT` 授權, 我會將查詢改成:
npm query "[license=MIT]"
如果我要找出所有專案內 git dependencies, 我可以執行:
npm query ":type(git)"
如果我要找出有哪些 transitive dependencies 使用了 `postinstall` script, 我可以執行:
npm query ":attr(scripts, [postinstall]):not(:root > *)"

程式使用方式

我們知道大部分在這個生態系的開發者也會想要自己運用這個新語法, 所以我們把他建立在 CLI 的程式大腦中. 在底層, 我們將新的 `.querySelectorAll()` 方法加入到現存的 `Node` Class, 在 `@npmcli/arborist` 函式庫中使用. 工具開發者們現在也可以載入並查詢他們的 dependencies, 如同我們這樣.
// index.js
const Arborist = require('@npmcli/arborist') 
const arb = new Arborist({})

arb.loadActual((tree) => {
   // query all workspaces
  const results = await tree.querySelectorAll('.workspace')
  console.log(results)
})
你可以在我們的文件上學到更多關於語法與用途: https://docs.npmjs.org/cli/v8/using-npm/dependency-selectors

下一步是甚麼?

未來我們計畫根據 registry metadata 加入新的 pseudo states 和 selectors, 應該會將另一些關於 auditing 的能力解鎖(舉例包括 `:outdated`, `:deprecated`, `:vulnerable`, `:cve()` 和 `:cwe()` ). 如同在原本的 RFC proposal 中所註記的, 我們也會考慮支援 `query` flag 或是從 `stdin` 讀取現存的指令.
分享至
成為作者繼續創作的動力吧!
叫我 KO, 我是一名軟體工程師. 我的文章不只是單純的譯文(翻譯原文), 而是會以我的角度理解, 把語言之間的隔閡拆解, 讓你輕鬆學習到知識. 領域基本上無設限, 前端, 後端, DevOps 都會觸及.
從 Google News 追蹤更多 vocus 的最新精選內容從 Google News 追蹤更多 vocus 的最新精選內容

發表回應

成為會員 後即可發表留言
© 2024 vocus All rights reserved.