gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

淺析Node.js + imgcook怎么自動生成依賴

怎么用 Node.js 輔助 imgcook 自動生成依賴?下面本篇文章就來給大家介紹一下生成方法,有一定的參考價值,希望對大家有所幫助!

淺析Node.js + imgcook怎么自動生成依賴

imgcook 在淘寶內部版本提供了類似依賴管理的功能,用于在 imgcook 編輯器編寫函數時引入其他依賴包,比如 axios、underscore、@rax/video 等。

淺析Node.js + imgcook怎么自動生成依賴

不過從使用體驗上,還是較為繁瑣,因為編輯器并沒有讓大家形成像在 package.json 聲明依賴的習慣,而且因為編輯器是 GUI 界面,所以從每個函數打開代碼,并查看依賴的操作是比較繁瑣的,這就導致每次開發完一個 imgcook 模塊后,如果依賴了其他包(大部分情況下都需要),就需要一個個打開函數并確認版本號,并在依賴管理中添加,這在我使用的過程中,往往是一次痛苦的過程。

如何解決

imgcook 提供了 Schema 源碼開發模式,通過在編輯器中直接修改模塊協議(Schema)就能替代 GUI 的操作步驟,然后通過搜索 dependencies,我發現依賴管理功能是通過協議中的 imgcook.dependencies 實現的:

{   "alias": "Axios",      "packageRax1": "axios",   "versionRax1": "^0.24.0",   "packageRaxEagle": "axios",      "versionRaxEagle": "^0.24.0",      "checkDepence": true  }

由于函數的代碼也存在協議中,那么是不是只需通過處理原協議文檔,掃描出對應的依賴并保存到節點中,再點擊“保存”就可以看到依賴管理中的包列表被更新了。

實現功能

為此我在 @imgcook/cli 中實現了拉取模塊協議內容的功能,具體 Pull Request 有:imgcook/imgcook-cli#12 和 imgcook/imgcook-cli#15,可以通過命令行工具拉取對應模塊的協議(Schema)如下:

$ imgcook pull <id> -o json

執行后會把模塊協議內容輸出到命令行中的 stdout。

有了這個功能后,就可以實現一些命令行工具,基于 Unix Pipeline 程序,與 imgcook-cli 的數據源形成協作,舉個例子,通過 imgcook pull 輸出的 JSON 并不易讀,那么不妨寫一個 imgcook-prettyprint 來美化輸出結果,代碼實現如下:

#!/usr/bin/env node  let originJson = '';  process.stdin.on('data', (buf) => {      originJson += buf.toString('utf8');    });  process.stdin.on('end', () => {      const origin = JSON.parse(originJson);      console.log(JSON.stringify(origin, null, 2));  });

上面的程序通過 process.stdin 接收管線(Pipeline)上游的數據,即 imgcook 模塊協議內容,然后在 end 事件中解析并美化輸出,運行如下命令:

$ imgcook pull <id> -o json | imgcook-prettyprint

就能看到美化后的輸出結果了,這就是一個 Unix Pipeline 程序的簡單示例。

接下來就來看下如何通過這種方式,完成依賴的自動生成。與上面例子類似,我們再創建一個文件 ckdeps:

#!/usr/bin/env node  let originJson = '';  process.stdin.on('data', (buf) => {      originJson += buf.toString('utf8');    });  process.stdin.on('end', () => {      transform();  });   async function transform() {      const origin = JSON.parse(originJson);      const funcs = origin.imgcook?.functions || [];      if (funcs.length === 0) {          process.stdout.write(originJson);          return;      }      console.log(JSON.stringify(origin));  }

通過 origin.imgcook.functions,可以獲取到函數的代碼內容,比如:

{      "content": "export default function mounted() {nn}",      "name": "mounted",      "type": "lifeCycles"  }

那么接下來就是通過解析 content,獲取到代碼中的 import 語句,再生成對應的依賴對象到 origin.imgcook.dependencies 中,那么我們需要引用 @swc/core 來解析 JavaScript 代碼:

const swc = require('@swc/core');   await Promise.all(funcs.map(async ({ content }) => {      const ast = await swc.parse(content);    	// the module AST(Abstract Syntax Tree)  }));

獲取到 ast 后,就能通過代碼獲取 import 語句的信息了,不過由于 ast 比較復雜,@swc/core 提供了專用的遍歷機制如下:

const { Visitor } = require('@swc/core/visitor');   /**    * 用于保存通過函數解析, 獲得的依賴對象列表    */  const liveDependencies = [];   /**  * 定義訪問器  */  class ImportsExtractor extends Visitor {      visitImportDeclaration(node) {          let alias = 'Default';          liveDependencies.push({              alias,              packageRax1: node.source.value,              versionRax1: '',              packageRaxEagle: node.source.value,              versionRaxEagle: '',              checkDepence: true,          });          return node;      }  }   // 使用方式  const importsExtractor = new ImportsExtractor();  importsExtractor.visitModule(ast);

ImportsExtractor 繼承自 @swc/core/visitor 的 Visitor,由于是要遍歷 import 聲明語句,它的語法類型名稱是 ImportDeclaration,因此只需要實現 visitImportDeclaration(node) 方法,即可在方法內獲得所有的 import 語句,再按照對應節點的結構轉換成依賴對象并更新就好。定義好抽取器后,剩下的事情就是把 ast 喂給抽取器,這樣就能把模塊所有的依賴都收集起來,用于后面依賴的生成。

從上面的代碼可以看到,版本號目前使用了空字符串,這會導致我們如果更新協議內容,依賴的版本信息會丟失,因此我們需要定義一種獲取版本的方法。

由于前端的依賴都是存儲在 NPM Registry 上的,因此我們可以通過 HTTP 接口來獲取版本,比如:

const axios = require('axios');  async function fillVersions(dep) {      const pkgJson = await axios.get(`https://registry.npmjs.org/${dep.packageRax1}`, { type: 'json' });      if (pkgJson.data['dist-tags']) {          const latestVersion = pkgJson.data['dist-tags'].latest;          dep.versionRax1 = `^${latestVersion}`;          dep.versionRaxEagle = `^${latestVersion}`;     }     return dep;  }

我們按照 https://registry.npmjs.org/${packageName} 的規則,就能拿到存儲在 Registry 中的包信息,然后 data['dist-tags'].latest 代表的是 latest 標簽對應的版本,簡單來說就是當前包的最新版本,然后再基于這個版本號增加一個 ^ 版本前綴即可(你也可以按照自己的訴求修改最終的版本以及 NPM Registry)。

最后一步,就是把我們從函數代碼中抓取的依賴信息更新,并輸出出來:

async function transform() {      // ...      origin.imgcook.dependencies = newDeps;      console.log(JSON.stringify(origin));  }

然后通過運行:

$ imgcook pull <id> -o json | ckdeps  > { ..., "dependencies": [{ ...<updated dependencies> }] }

然后,開發者只需要把輸出的 JSON 拷貝到編輯器中保存。哦,等等,在編輯器中并不能直接使用 JSON 保存,而是需要使用 ECMAScript Module 的方式(export default { ... }),那這樣是不是意味著每次都需要手動編輯一下呢,答案是否,Unix Pipeline 的思路非常利于解決這種流程問題,我們只需要再新建一個節點腳本 imgcook-save 即可:

#!/usr/bin/env node  let originJson = '';  process.stdin.on('data', (buf) => {     originJson += buf.toString('utf8');   });  process.stdin.on('end', () => {     transform();  });   async function transform() {      const origin = JSON.parse(originJson);     console.log(`export default ${JSON.stringify(origin, null, 2)}`); }

最后完整的命令是:

$ imgcook pull <id> -o json | ckdeps | imgcook-save  > export default {   ... }

這樣,我們就可以直接拷貝內容到編輯器。

效果體驗

淺析Node.js + imgcook怎么自動生成依賴

比如,我在喔其中一個項目的 created 函數中增加了 axios 的依賴,關閉窗口后點擊保存(確保 Schema 保存),然后通過命令:

$ imgcook pull <id> -o json | ckdeps -f | imgcook-save

然后在編輯器中打開 Schema 編輯,復制生成的內容并保存,然后打開“依賴管理”可以看到:

淺析Node.js + imgcook怎么自動生成依賴

通過解析生成的代碼已經更新到依賴面板了,這下終于可以解放雙手,去做其他的事情了。

One more thing?

是不是這樣就結束了呢?在 macOS 中,提供了 pbcopy 命令,可以復制 stdin 到剪貼板,那么跟 imgcook 的例子結合一下:

$ imgcook pull <id> -o json | ckdeps | imgcook-save | pbcopy

這樣就省掉了自己拷貝的工作,命令執行完直接打開編輯器 ?V 即可。

最后的最后,我要升華一下主題,在 @imgcook/cli 支持了輸出 JSON 文本的功能后,就意味著 imgcook 接入了 Unix Pipeline 的生態,通過這種方式,我們可以在這個過程中構建很多有趣實用的工具,并與很多 Unix 工具協作使用(比如 bpcopy、grep、cat、sort 等)。

本文只是通過依賴的自動生成為例,使用 Unix Pipeline 的方式,驗證了其可行性以及和 imgcook 編輯器配合使用的體驗,目前來說,我可以通過這種方式,彌補不少編輯器上的體驗缺失,讓我更方便地使用 imgcook 的核心功能。

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
亚洲精品中文字幕乱码无线| 天堂v在线视频| 国产一区二区在线观看免费视频| 深夜做爰性大片蜜桃| 婷婷五月综合缴情在线视频| 四季av一区二区| 亚洲国产精品无码观看久久| 老司机午夜性大片| 情侣黄网站免费看| 男人天堂手机在线视频| www激情五月| 亚洲36d大奶网| 日本中文字幕网址| 女人被男人躁得好爽免费视频| 日本肉体xxxx裸体xxx免费| 日韩中文字幕三区| 国产精品12345| 国产一线二线三线女| 日本福利视频在线观看| 日本高清免费在线视频| 亚洲黄色av片| 中文av一区二区三区| 色七七在线观看| 男女视频在线看| 亚洲中文字幕久久精品无码喷水| 精品久久一二三| 国自产拍偷拍精品啪啪一区二区 | 中日韩av在线播放| 欧美一级特黄aaa| 国产精品久久成人免费观看| 久久久精品高清| 在线观看视频黄色| 精品国产一区二区三区在线| 国产成人强伦免费视频网站| 欧美激情第一区| 五月天色婷婷综合| 日韩精品一区在线视频| 97成人在线免费视频| 成人一对一视频| 别急慢慢来1978如如2| 亚洲一二三区av| 久久免费视频2| 国产经典久久久| 日日碰狠狠添天天爽超碰97| 国产成人a亚洲精v品无码| 校园春色 亚洲色图| 久久久久xxxx| 久久在线中文字幕| 另类小说色综合| 9色视频在线观看| 国产主播在线看| 992tv人人草| www.av片| 日日噜噜夜夜狠狠| 成人区一区二区| 亚洲一区二区三区四区五区xx| 久久久一二三四| 九九九九免费视频| 国产资源中文字幕| 91猫先生在线| www.69av| www.亚洲高清| 免费在线看黄色片| 一本岛在线视频| 777精品久无码人妻蜜桃| 亚洲精品自拍网| 成人在线免费在线观看| 99精品视频免费版的特色功能| www精品久久| 涩涩网站在线看| 欧美丰满熟妇xxxxx| 800av在线免费观看| 高清一区二区视频| 欧美成人免费在线观看视频| 91性高潮久久久久久久| 日韩欧美xxxx| 一女被多男玩喷潮视频| 国产人妻互换一区二区| 三级视频中文字幕| 无码人妻丰满熟妇区毛片| 妞干网视频在线观看| 五月天婷婷在线观看视频| 成人av一级片| 拔插拔插海外华人免费| 蜜臀av.com| 国产在线拍揄自揄拍无码| 欧美大黑帍在线播放| 亚洲精品久久久中文字幕| 欧在线一二三四区| 精品99在线视频| 黄色动漫在线免费看| 黄色片网址在线观看| 亚洲精品国产suv一区88| www.国产福利| 五月花丁香婷婷| 老司机久久精品| 中日韩av在线播放| 午夜国产福利在线观看| 五月天中文字幕在线| 在线免费观看av的网站| 91日韩视频在线观看| 日本一二区免费| 又色又爽又黄视频| 无码人妻精品一区二区蜜桃百度| 在线成人免费av| 日本老太婆做爰视频| 大桥未久一区二区| 农民人伦一区二区三区| koreanbj精品视频一区| 黄色片视频在线播放| 日av中文字幕| 色偷偷中文字幕| 国产91在线亚洲| 国产白丝袜美女久久久久| www黄色在线| 亚洲综合123| 国产xxxx振车| www.天天射.com| 欧美性视频在线播放| 分分操这里只有精品| 狠狠热免费视频| 男人的天堂成人| 欧美黑人经典片免费观看| 97xxxxx| 九九热免费在线观看| 久久国产精品免费观看| 国产91美女视频| 交换做爰国语对白| 日韩国产欧美亚洲| 国产亚洲视频一区| 精品欧美一区免费观看α√| 青青草av网站| 国产情侣第一页| 亚洲免费999| 成人免费观看视频在线观看| 手机在线视频一区| 国产亚洲欧美在线视频| 日本在线观看视频一区| 精品无码国产一区二区三区av| 草草草在线视频| 成年女人18级毛片毛片免费| 天堂中文视频在线| 成 年 人 黄 色 大 片大 全| 久久精品亚洲天堂| 天天操天天爱天天爽| 精品无码国模私拍视频| 久久精品一卡二卡| 99免费视频观看| 国产精品国产亚洲精品看不卡| 三级黄色片免费观看| 亚洲人成无码www久久久| 中文字幕人妻熟女人妻洋洋| 黄色小视频免费网站| 亚洲熟妇av一区二区三区| 六月婷婷激情综合| 一本—道久久a久久精品蜜桃| 毛片av免费在线观看| 玩弄中年熟妇正在播放| 欧美精品卡一卡二| 国产香蕉一区二区三区| av在线网站免费观看| 不卡的av中文字幕| 黑森林精品导航| 成年人在线观看视频免费| 午夜精品久久久内射近拍高清| 国产乱子伦精品视频| 精品人妻一区二区三区四区在线| 国产精品视频一二三四区| 欧美一级免费在线| 91高清国产视频| 国产永久免费网站| 中文字幕超清在线免费观看| 黄色免费高清视频| 公共露出暴露狂另类av| 粉嫩av一区二区三区天美传媒| 亚洲免费在线播放视频| 欧美少妇一级片| 天天操天天干天天玩| 日本男女交配视频| 黄网站欧美内射| 日韩一级免费在线观看| 日韩欧美黄色大片| theporn国产精品| 日日噜噜噜夜夜爽爽| 国产树林野战在线播放| 国产免费一区二区视频| 妺妺窝人体色www在线小说| 色悠悠久久综合网| www.国产福利| 国产夫妻自拍一区| 成人一区二区三| 视频一区二区视频| 91免费黄视频| 激情五月俺来也| a级片一区二区| 国产裸体舞一区二区三区| 日本在线播放一区二区| 成人精品视频在线播放| 妞干网在线免费视频| 日本一本在线视频|