Electron常見(jiàn)問(wèn)題(三)常用路徑/靜態(tài)資源丟失

本文主要是描述electron中路徑相關(guān)的問(wèn)題

  • 靜態(tài)資源丟失的原因
  • 靜態(tài)資源路徑一致性處理方案-resolvePath
  • 常用路徑---userPath/appData/文檔
  • pathUtil的封裝

一螟左、靜態(tài)資源丟失的原因

Electron常見(jiàn)問(wèn)題(二)Electron圖標(biāo)打包我們討論過(guò)靜態(tài)資源的打包咨堤,但有時(shí)候我們會(huì)碰到在local環(huán)境運(yùn)行程序的時(shí)候靜態(tài)資源可以看到蔚携,但是build成產(chǎn)品后靜態(tài)資源丟失的情況肤频。
這里用托盤(pán)圖標(biāo)舉例愉棱。
托盤(pán)圖標(biāo)的靜態(tài)資源我們通過(guò)extraResources復(fù)制操作放到打包后的文件中

package.json
{
    ...  
    "build": {
      ...
      "extraResources": [
        {
          "from": "icons/", 
          "to": "icons/"
        } // 可以移動(dòng)多個(gè)文件夾,from-to
      ],  
      ...
    },
    ...
}

打包后的icons會(huì)復(fù)制到文件的resources中



local環(huán)境中我們引入圖標(biāo)使用相對(duì)路徑來(lái)引入圖標(biāo)

const iconName =process.platform === 'win32' ?
 'icons/windows-icon.png' : 'icons/iconTemplate.png';
const ningImage = nativeImage.createFromPath(iconName);
tray = new Tray(ningImage);

我們的主代碼會(huì)被打包在app.asar中


主代碼打包位置

對(duì)于主代碼來(lái)說(shuō),圖標(biāo)的位置在 'icons/windows-icon.png' 沒(méi)有錯(cuò)沐旨。

但在local環(huán)境我們的主代碼在app/main.developments.ts中,這樣 'icons/windows-icon.png' 是找不到對(duì)應(yīng)的icon的榨婆。


本地項(xiàng)目

二磁携、 靜態(tài)資源路徑一致性處理方案-resolvePath

為了解決路徑不一致的情況,我們可以封裝一個(gè)resolvePath類良风,將local環(huán)境的路徑和產(chǎn)品環(huán)境的路徑相一致谊迄。

export default class PathUtils {
    // 將startPath作為標(biāo)準(zhǔn)路徑,靜態(tài)資源的路徑和項(xiàng)目中使用到的路徑全部由startPath起始
    public static startPath = path.join(__dirname, '..');

    public static resolvePath = (dirPath) => {
        return path.join(PathUtils.startPath, dirPath || '.');
    };
}

這樣拖吼,相應(yīng)的tray圖標(biāo)引入方式改為

const iconName =
        process.platform === 'win32'
            ? PathUtils.resolvePath('icons/windows-icon.png')
            : PathUtils.resolvePath('icons/iconTemplate.png');
    const ningImage = nativeImage.createFromPath(iconName);

    tray = new Tray(ningImage);

三疮胖、常用路徑---userPath/appData/文檔

我們系統(tǒng)的配置文件通常放到用戶目錄下忌愚,如 C://User/Administrator/xxxconfig.json 中态鳖,這個(gè)路徑一般稱為userProfile,但是這是初始的情況在孝,有的用戶系統(tǒng)盤(pán)放在D盤(pán)E盤(pán)等其他盤(pán),這時(shí)對(duì)應(yīng)的用戶目錄位置也會(huì)改變怠硼。
所以我們的用戶目錄一般使用userProfile來(lái)獲取鬼贱,這個(gè)變量在electron的環(huán)境變量中也是可以找到的。

process.env['USERPROFILE'];

同樣的用戶的緩存目錄APPDATA路徑為

process.env['APPDATA']

還有一個(gè)常用路徑是文檔香璃,我們熟知的qq这难,微信等接受到的文件一般都會(huì)緩存在這個(gè)位置。


常用路徑文檔庫(kù)

而文檔的位置在electron中是找不到的葡秒,而且文檔映射的路徑也是可以手動(dòng)編輯的姻乓。
但它最終是存在注冊(cè)表中的。所以我們需要花些手段去讀取注冊(cè)表眯牧。
好在網(wǎng)上可以找到regedit組件可以讓nodejs訪問(wèn)注冊(cè)表蹋岩。
接下來(lái)我們只要找到文檔對(duì)應(yīng)的位置就可以了。

注冊(cè)表中的文檔位置

四学少、pathUtil的封裝

增加了userPath/appData/文檔路徑剪个,我們的pathUtil也要進(jìn)行升級(jí),如下

export default class PathUtils {
    public static startPath = path.join(__dirname, '..');

    public static userPath = process.env['USERPROFILE'];

    public static userDocPath;

    public static appdataPath = process.env['APPDATA'];

    public static resolvePath = (dirPath) => {
        return path.join(PathUtils.startPath, dirPath || '.');
    };

    public static resolveUserPath = (dirPath) => {
        return path.join(PathUtils.userPath, dirPath || '.');
    };

    public static resolveUserDocPath = (dirPath) => {
        return new Promise((resolve, reject) => {
            getUserDoc().then((docPath: string) => {
                PathUtils.userDocPath = docPath;
                resolve(PathUtils.userDocPath);
            });
        });
    };
}

const getUserDoc = () => {
    return new Promise((resolve, reject) => {
        const regedit = require('regedit');
        regedit.setExternalVBSLocation(PathUtils.resolvePath('vbs'));

        const key = 'HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders';
        regedit.list(key, function(err, result) {
            if (err) {
                console.error('Window Reg:', err);
            } else {
                try {
                    resolve(result[key].values['Personal'].value);
                } catch (e) {
                    const docPath = path.join(PathUtils.userPath, 'Documents');
                    if (!fs.existsSync(docPath)) {
                        fs.mkdirSync(docPath);
                    }
                    resolve(docPath);
                }
            }
        });
    });
};

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末版确,一起剝皮案震驚了整個(gè)濱河市扣囊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绒疗,老刑警劉巖侵歇,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異吓蘑,居然都是意外死亡盒至,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)枷遂,“玉大人,你說(shuō)我怎么就攤上這事棋嘲【瓢Γ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵沸移,是天一觀的道長(zhǎng)痪伦。 經(jīng)常有香客問(wèn)我,道長(zhǎng)雹锣,這世上最難降的妖魔是什么网沾? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮蕊爵,結(jié)果婚禮上辉哥,老公的妹妹穿的比我還像新娘。我一直安慰自己攒射,他們只是感情好醋旦,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著会放,像睡著了一般饲齐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咧最,一...
    開(kāi)封第一講書(shū)人閱讀 52,394評(píng)論 1 310
  • 那天捂人,我揣著相機(jī)與錄音,去河邊找鬼矢沿。 笑死滥搭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的咨察。 我是一名探鬼主播论熙,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼摄狱!你這毒婦竟也來(lái)了脓诡?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤媒役,失蹤者是張志新(化名)和其女友劉穎祝谚,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體酣衷,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡交惯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片席爽。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡意荤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出只锻,到底是詐尸還是另有隱情玖像,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布齐饮,位于F島的核電站捐寥,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏祖驱。R本人自食惡果不足惜握恳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捺僻。 院中可真熱鬧乡洼,春花似錦、人聲如沸陵像。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)醒颖。三九已至妻怎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泞歉,已是汗流浹背逼侦。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腰耙,地道東北人榛丢。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像挺庞,于是被迫代替她去往敵國(guó)和親晰赞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 古人有云:天不得時(shí)戏挡,日月無(wú)光。地不得時(shí)晨仑,草木不生褐墅。馬有千里之程拆檬,無(wú)騎不能自往;人有沖天之志妥凳,非運(yùn)不能自通竟贯,一生皆由...
    左大林命理閱讀 501評(píng)論 0 0
  • 昨晚臨睡前在為你讀詩(shī)的公眾號(hào)里看到了一篇有關(guān)賴聲川先生講述的文章《打開(kāi)自我,感受活著的每一個(gè)時(shí)刻》逝钥,文中開(kāi)頭的一段...
    多寫(xiě)幾個(gè)字閱讀 200評(píng)論 0 5
  • 1.有什么事情是早知道的晌缘?還有沒(méi)有更早的? 一定要堅(jiān)信自己的選擇痢站,選擇之后還要繼續(xù)研究分析磷箕。 早知道只是發(fā)生在已經(jīng)...
    堅(jiān)持Benoy閱讀 545評(píng)論 0 1
  • 第一次篤定地覺(jué)得即使受傷也要去愛(ài)他岳枷!不想再錯(cuò)過(guò),他不是最帥的呜叫,不是最有錢的空繁,家境不是最好的,反復(fù)想過(guò)這些問(wèn)題還是決...
    龍之吻_Refine閱讀 162評(píng)論 0 0