摘要:寫個命令行工具上面的方式是可以得到我們想要的結果,可是如果我想從一批名字中選一個可用的,就沒有那么方便了,就要一個一個試了。二開始寫工具之前有一篇文章,講了怎么寫一個命令行工具,見這里手把手教你寫命令行工具。
事情是這樣的:NPM方式因為我經常會寫一些npm包,但是有時候我寫完一個包,npm publish 的時候卻被提示說包名字被占用了,要不就改名字,要不就加scope,很無奈。
npm 命令行可以通過 npm view 的方式去得知一個包是否存在,但是無法批量得知,所以就想著寫一個工具來批量選名:)本教程的相關代碼已經全上傳到github: 源代碼
在寫工具之前,我們先看看怎么通過 npm 提供的命令來得知包名是否被占用。
npm view
通過 npm view -h 我們可以得知其用法:
npm view [<@scope>/][@ ] [ [.subfield]...] aliases: v, info, show
通過以上命令來看看 unused-npm-names 包:
npm view unused-npm-names # 或者 npm info unused-npm-names
會輸出:
{ name: "unused-npm-names", "dist-tags": { latest: "1.1.1" }, versions: [ "1.0.0", "1.0.1", "1.1.0", "1.1.1" ], time: { created: "2018-09-07T02:53:05.277Z", "1.0.0": "2018-09-07T02:53:05.439Z", modified: "2018-09-07T03:44:06.363Z", "1.0.1": "2018-09-07T03:07:46.542Z", "1.1.0": "2018-09-07T03:35:40.221Z", "1.1.1": "2018-09-07T03:44:03.534Z" }, maintainers: [ "pjy <731401082@qq.com>" ], description: "Find unused npm names", homepage: "https://github.com/PengJiyuan/unused-npm-names#readme", keywords: [ "npm", "names", "unused", "find" ], repository: { type: "git", url: "git+https://github.com/PengJiyuan/unused-npm-names.git" }, author: "PengJiyuan", bugs: { url: "https://github.com/PengJiyuan/unused-npm-names/issues" }, license: "MIT", readmeFilename: "README.md", version: "1.1.1", main: "index.js", bin: { unn: "cli.js" }, scripts: { test: "echo "Error: no test specified" && exit 1" }, dependencies: { axios: "^0.18.0", chalk: "^2.4.1", commander: "^2.17.1" }, gitHead: "818611db1c2baeb589cb3f639559ab6afc9f8e8f", dist: { integrity: "sha512-t9bCfY3qbeVY54QC6Cznn3YhM0jq6HX0fE0r5TMAq1IOzu+NQ/caA8tfj62pZtDuZKb9R29ne7UyPB+4zAAplw==", shasum: "0b7c162f7656c0d74868bf567713150488f8c473", tarball: "https://registry.npmjs.org/unused-npm-names/-/unused-npm-names-1.1.1.tgz", fileCount: 5, unpackedSize: 4544, "npm-signature": "-----BEGIN PGP SIGNATURE----- Version: OpenPGP.js v3.0.4 Comment: https://openpgpjs.org wsFcBAEBCAAQBQJbkfQDCRA9TVsSAnZWagAAwS4QAKFC1MnosxmJEws07U4O gfUPLP04ZLZqtW6nuB/29A72DE1+bh/TGsir83r/sYf1TAPSLOCRd3Nrky3A 7+umUUOl5zGU5WyG86Fo2XOl5cYgXXWXU6LcZufG/cwM3Xi9MUfxnT7zCEWt QPAE8Oh9UhkWCnvFMBA6M6knqK9K08nQf0Ke55UoiuX+OqF8BUlNw8LqEwrI MTW8hpjKqsAdo3JhBu0ZkrfTRMq7cTawfjAg+qDs4SSTuWD9OJ9d/2y4OC/p X6+3I+Et+SqFJxjGDBounjF1GYYiH3dQPRN8UWL1p9Ypu6YsiZ7l8dp6RH15 HFUv6lsCmZvhkKc1zO1pY67xUOA9VbLjhXtObwopFvCIehlv3cCw5FMwoa7x z+tou0J4II6n68cG6IfTt+9odi9abj7M2YxStW32Miu3efhpXiw2PpX3HWOW jkY7IQryyxJbQIdKHJqJ59fADHLxpdmr6WADYWt8mKI+9TK9onpSgFgX4udw g7fXN3z/L6i7yY+0fvvX/b0jjVzVFNP5kFnUBSnWk/Hjm+h96QS+0xfRCRNv 5CmVT2kbxYNAdFsFFoNCqHqE+uQoMrSwBw1SIJdybWjs84QrLOrDFjhKypev l6bzrgcyE0VWYY1A+zdyquL1cQ+xEJacsfN5NbicxTZhDU0enAtcxhKSe7bz J9CP =t8xy -----END PGP SIGNATURE----- " }, directories: {} }
這樣的輸出太長了,我們可以只看 unused-npm-names 最近的版本號:
npm view unused-npm-names version
會輸出:
1.1.1
當然,如果這個包不存在的話,就會報 404 的錯誤,我們也就知道這個包名是否被占用了。
寫個命令行工具上面的方式是可以得到我們想要的結果,可是如果我想從一批名字中選一個可用的,就沒有那么方便了,就要一個一個試了。
如果有一個工具可以像這樣使用:
unn react react-router react-dom react-pp react-fdasf
能一步鑒別所有的包,那就太方便了。
所以,我們一步一步來看一下應該怎么實現這個功能。
一、看npm如何做的我們通過 npm view 可以查看一個包的信息,那么在走這個命令的時候,npm 肯定是發了一個請求去拿到的這個包的數據,那么我們怎么知道 npm 發的什么請求呢?
# 加 --verbose 后綴來看詳細的輸出 npm view unused-npm-names --verbose
會輸出:
... npm http request GET https://registry.npmjs.org/unused-npm-names ... npm info ok
我們在其中發現,npm 發了個 GET 請求,請求的url是 https://registry.npmjs.org/unused-npm-names。
哦,那知道了,我們可以請求 https://registry.npmjs.org/${packageName} 來獲取名為 packageName 的包信息。當然,在npm的官方倉庫也能找到相關api的用法:package-metadata。
二、開始寫工具之前有一篇文章,講了怎么寫一個命令行工具,見這里:手把手教你寫命令行工具。這篇文章就不從怎么從零開始構建一個命令行工具開始了,我們直接來代碼:
文件目錄大概是這樣:
unused-npm-names ├── node_modules ├── package.json ├── cli.js (bin) └── index.js (main)
package.json:
{ "name": "unused-npm-names", "version": "1.0.0", "description": "Find unused npm names", "main": "index.js", "bin": { "unn": "cli.js" }, "scripts": { "test": "echo "Error: no test specified" && exit 1" }, "license": "MIT", "dependencies": { "axios": "^0.18.0", "chalk": "^2.4.1", "commander": "^2.17.1" } }
通過 package.json 中設置 bin 字段,我們將命令的名字設置為 unn,比較簡短,方便實用。
我們把查詢的主邏輯放到 index.js 中,把命令行邏輯放到 cli.js 中,這樣的話我們既可以通過 cli 的方式去使用,也可以通過 require 的方式在 nodejs 腳本中使用。
// index.js const axios = require("axios"); // 用于發送 http 請求 const chalk = require("chalk"); // 終端輸出帶顏色的文本 // search方法的參數是一個數組,存放著需要查詢的包的名字 // 比如我們要查詢 react和react-dom,那么search(["react", "react-dom"]) function search(pkgs = []) { if (!Array.isArray(pkgs)) { throw "Param should be an array."; } console.log(); pkgs.forEach((pkg) => { axios.get(`https://registry.npmjs.org/${pkg}`) .then((res) => { // 如果請求成功,說明包存在,那么名字被占用。 console.log(`${chalk.cyan(pkg)}: ${chalk.red("Used ?")}`); }) .catch((err) => { // 如果請求失敗,并且是因為404報錯,那么證明包不存在,名字可用。 if (err.stack && /Request failed with status code 404/.test(err.stack)) { console.log(`${chalk.cyan(pkg)}: ${chalk.green("Unused ?")}`); } else { // 處理未知情況 console.log(`${chalk.cyan(pkg)}: ${chalk.gray("Unknown
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/97530.html
摘要:命令行工具,即。我們在寫命令行工具的時候,需要指定一個可執行文件。或者四調試我們全局安裝一個包后,可以全局調用這個命令行工具。 命令行工具,即 Cli(command-line interface)。是在圖形用戶界面得到普及之前使用最為廣泛的用戶界面,它通常不支持鼠標,用戶通過鍵盤輸入指令,計算機接收到指令后,予以執行。在學習這篇教程之前,你需要先了解NodeJs,NPM和一些常用的...
摘要:眾所周知,在大公司中進行大的改革很難。目前公司有超過名開發人員,其中有個以上是前端。從年起,已經在一些小規模團隊中探索使用。在年的前端調查中,靜態類型系統呼聲最高。在我們的主倉庫中,絕大多數的公共依賴都已經由做到了類型聲明。 特別說明 這是一個由simviso團隊進行的關于Airbnb大規模應用TypeScript分享的翻譯文檔,分享者是Airbnb的高級前端開發Brie Bunge ...
摘要:但在生產環境下,如果不指定保存依賴的版本號會存在問題。它會生成一個文件,不僅記錄了當前環境中使用的模塊精確的版本號,還記錄了這些模塊的其他依賴的版本,以此類推。 本文來自國外新手向技術博客RisingStack。有興趣的同學可點擊原文查看。 相信npm install是npm-cli最常用的功能,但其實它還有很多其他可挖掘的地方。在本文中,你將會學習如何在應用開發的整個生命周期中——...
摘要:博客地址這篇文章是我在眾成翻譯翻譯的一篇文章,一篇的入門指南,原文鏈接的出現使得用寫服務端應用成為可能。你可以看到,這個過程也安裝了其他的模塊,它們都是的所依賴的模塊。但是,得到的輸出信息會很冗長,我們可以加上來精簡一下輸出。 github 博客地址: https://github.com/zengxiaota... 這篇文章是我在 眾成翻譯 翻譯的一篇文章,一篇 npm 的入門指南,...
摘要:三配置環節目的一是為之后的環節初始化工作流參數,二是準備好應用文件夾內容即要打包的目標文件夾做的事解析命令行參數,初始化工作參數,填充配置文件,把配置文件和相關依賴文件導入到文件夾內合適的 首發于酷家樂前端博客,作者@摘星(segmentfault @StinsonZhao) 我們能從很多地方學習到怎么起一個 Electron 項目,有些還會介紹怎么打包或構建你的代碼,但距離「真正地...
閱讀 1437·2021-11-25 09:43
閱讀 2580·2021-09-24 10:30
閱讀 3659·2021-09-06 15:02
閱讀 3593·2019-08-30 15:55
閱讀 3300·2019-08-30 15:53
閱讀 1693·2019-08-30 15:52
閱讀 2142·2019-08-30 14:21
閱讀 2010·2019-08-30 13:55