Node獲取pnpm安裝的包源碼及代碼路徑操作
前言
在改造老工程的包依賴管理的時候,有時候我們想引入一些社區(qū)比較好用的包管理;有時候一些阻塞點會阻攔我們,特別我們構(gòu)建流程可能會拷貝node_modules包源碼的行為;
舉個研發(fā)例子
不同公司的CLI因為面對的業(yè)務(wù)場景和構(gòu)建場景不一樣,有些時候,我們會做一些差異化的特性,比如工程前端CLI有暴露代碼映射拷貝行為,就是打包的時候會把node_modules下的某些包的資源拷貝到特定路徑,用于后續(xù)其他處理
// 本地調(diào)試 editor 時需要打開以下配置
copy: {
// editor source reference
'dist/libs/ckeditor': 'node_modules/xxxx-editor/dist',
},
npm安裝的目錄結(jié)構(gòu)是固定的,包名+源文件 ,所以尋址是固定的

問題聚焦
當我們想用pnpm這類的時候,安裝的node_modules目錄結(jié)構(gòu)就是有他們自己的一些特性,而不是一個常規(guī)npm生成的node_modules結(jié)構(gòu)
pnpm 默認創(chuàng)建了一個非平鋪的 node_modules,因此代碼無法訪問任意包
如圖所示:

這種包名加版本號的,就沒法作為一個固定規(guī)律尋址了。因為存在可變性!那么我們實在要搞,有木有法子?
姿勢
node里面有一個api [require.resolve]很實用,剛好解決了我們這個場景;它可以返回require包的絕對路徑【基于package.json的入口字段】
demo
在我的一個本地工程內(nèi),采用pnpm安裝依賴,輸出的絕對路徑可以尋址到源碼
console.log(require.resolve('yaml'));
console.log(require.resolve('axios'));
// /Users/code/engineering-tools/node_modules/.pnpm/yaml@2.1.1/node_modules/yaml/dist/index.js
// /Users/code/engineering-tools/node_modules/.pnpm/axios@0.21.4/node_modules/axios/index.js

那么怎么適配我們之前的配置文件呢?
// 本地調(diào)試 editor 時需要打開以下配置
copy: {
// editor source reference
'dist/libs/ckeditor': require.resolve('xxxx-editor'),
},
這時候CLI運行態(tài)的時候就可以動態(tài)檢測到這個模塊的絕對路徑,拿到了絕對路徑。接下來想拷貝什么就很方便做到了~
以上就是Node獲取pnpm安裝的包源碼及代碼路徑操作的詳細內(nèi)容,更多關(guān)于Node pnpm安裝包路徑的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Linux系統(tǒng)中利用node.js提取Word(doc/docx)及PDF文本的內(nèi)容
這篇文章主要給大家介紹了關(guān)于Linux系統(tǒng)中利用node.js提取Word(doc/docx)及PDF文本的內(nèi)容,文中給出了詳細的示例代碼供大家參考學習,需要的朋友們下面跟著小編來一起看看吧。2017-06-06
什么時候不能在 Node.js 中使用 Lock Files
這篇文章主要介紹了什么時候不能在 Node.js 中使用 Lock Files,但是當你在開發(fā)要發(fā)布到 npm 的包時,應(yīng)避免使用這類 lock file 。下面我們來一起了解一下吧2019-06-06
Node.js在child_process域和錯誤冒泡及捕獲實踐
這篇文章主要為大家介紹了Node.js在child_process域和錯誤冒泡及捕獲實踐示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11
nest.js,egg.js,midway,express,koa的區(qū)別小結(jié)
本文主要介紹了nest.js,egg.js,midway,express,koa的區(qū)別小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-05-05
Windows 系統(tǒng)下安裝和部署Egret的開發(fā)環(huán)境
Egret基于TypeScript開發(fā)的,而TypeScript編譯工具tsc是基于Node.js 開發(fā)的。所以在安裝過程中,我們先需要對于基礎(chǔ)支持工具進行安裝。2014-07-07

