Devcker天天踩坑

日常踩坑紀錄

快到了年底想說要來犒賞自己來買已經聽說很久的Grado sr325e,結果到了要買的當天,已經下單但老闆打給我說有人比我早預訂了,問我要不要改成m2e,我當下猶豫了一下,想說也聽說m2e跟sr325e是兄弟,所以就決定入這隻了XD

微開箱

Alessandro m2e

我買的版本是木盒版的,我不知道一般版的長怎樣,但木盒版的就是一開箱拿出來就是一個大木盒

上面刻著大大的GRADO,雖然我這隻不是Grado就是了xd

Alessandro m2e

這木盒真的超有質感,以後就算不拿來放耳機純當裝飾都覺得很可以

Alessandro m2e

木盒一打開就是這篇的主角了 Alessandro m2e

Alessandro m2e

單體的外殼上面寫著是由grado製造的,但中間就少了grado的字樣,還是覺得有點可惜xd

聽感

一開箱完直接聽的感覺其實就跟ptt上討論的差不多,是一種比較新鮮的聲音,但聽說sr325e會更刺激,整體來說整個樂器跟人聲都靠很近,雖然不會糊,但是解析度可能就沒有其他廠牌那麼好,但誰在乎呢XD

這隻我認為主要是他的聲音的氛圍,真的很像站在演唱會前幾排那樣,整個會很帶動,這隻聽說吉他跟鼓有特化,我一拿到也是直接去聽平常聽的金屬跟硬滾搖,當下真的是有種說不出來的感動

因為整個聲音都直接擠在左右耳,整個樂器的配置會有點擠,但是聽起來真的很爽,就像是樂器直接放在你耳朵旁邊吼一樣,聽說這個在sr325e上會更狂野,說真的很想試試看xd

適合的曲風

我個人認為這隻很雜食,什麼樣的曲風我都覺得很適合,而且可以很享受,我個人最推重金屬跟搖滾,真的是有夠合的,可能是我第一次聽到這樣的聲音,現在都把它當作是我聽搖滾的專武了

但是金屬上我覺得只有重金屬比較適合,如果是鞭,黑,死我覺得還是少了一點什麼,我不確定這個是不是強化一下前端就可以補足,我自己也說不上來少了甚麼,雖然聽起來很爽,但真的少了什麼

其他曲風像流行樂,我都覺得應該會滿適合的XD,唯一可能會有問題的可能是那種大編制的音樂,你可能會覺得整個編制擠在耳朵旁邊,這部分建議自己去試聽最清楚XD

結論

我覺得這隻很值回票價,如果是要找搖滾用的耳機,這隻絕對很適合,而且還是買到木盒版真的是很值得收藏XD

最後可能以後會去改成平衡,看到PTT上大大推這隻的平衡像有如鬼神一樣,我真的有夠好奇到底是會變成怎樣的聲音,如果之後有改成平衡會在更新XD

最後可能就是少逛PTT耳機版,看完就會發現多幾隻耳機XD

最近都在cardano上面買NFT一開始只有看到CNFT.IO,但隨著整個社群越來越大,各種NFT交易所也出現了,而且都還能用CARDANO的智能合約來進行購買,所以這篇來整理一下目前CARDANO的NFT交易所

以下CARDANO NFT簡稱CNFT

在進行加密貨幣交易之前,請自己多加研究,這篇列出的交易所,我不保證不是詐騙,所以請自己評量風險後再行動喔,特別是有支援智能合約的網站,請研究後再連接錢包

另外對CNFT有興趣的,我之前也有寫一篇CNFT常用的工具整理 個人常用Cardano NFT工具整理 CNFT

CNFT.IO

CNFT.IO

這個網站是我自己主要用來買CNFT的網站,雖然還沒有支援智能合約,但這間是目前在CARDANO上流動性最大的交易所,最近也支援競價,可以期待之後有智能合約的功能

tokhun.io

tokhun.io

這間是我偶爾會在opencnft上面有進行交易的交易所,進入market之後會發現頁面長得很像opensea,左邊會有過濾選項,右邊則是nft

這間比較特別的是,他可以賣一整包nft,像pavia的九宮格bundle在上面也是很常見,而且很方便

然後這間也是支援智能合約,所以用智能合約買完之後可以直接拿到NFT

JPG.STORE

JPG.STORE

這間是我在找有支援智能合約的交易所時發現的,目前是還沒用過,但這間介面我非常喜歡,簡潔一目了然

而且這間看起來只會賣有認證過的CNFT,每個項目都會有一個頁面,可以減少買到假貨的機會,這間也是有支援智能合約(不然我也不會找到他)

adapix.io

adapix.io

這間也是我再找支援智能合約的網站時找到的,外表看起來也是跟opensea很像,目前看不出有什麼特點,等我哪天有在上面交易再來分享心得

因為公司有這需求,所以最近在將公司的chrome extension轉換成macos上的safari extension,之後發現各種資源真的有夠少,開發社群看起來也不活躍,加上大部分都是英文,真的是有點痛苦xd

不過最後還是給他用出來了,來分享一下這次轉換有踩到的坑

1. 對macos不熟

因為safari需要用到xcode去build,所以需要用到macos環境來跑這個東西,對上班用linux,回家用windows的我來說,macos真的是非常陌生xd

雖然公司有配一台mac mini給我,但我還是花了半天來熟悉這個OS跟建立整個開發環境

2. icon popup內的內容不會自動inject content script

正確來說應該是icon popup內的iframe不會去載入all frame的content script

在chrome系跟firefox是可以正常工作的,但是在safari不知道是還沒實作還是覺得這樣太危險,所以就會有這個限制

因為我這邊有寫一個跟extension溝通用的sdk,原本會直接被all frame的content script給載入到各個視窗,方便我在各畫面都可以透過sdk去跟extension background做溝通

但是safari上做不到這點,所以後來我的解法是將sdk移到popup page上的script,用popup page來當iframe跟background的橋,iframe內原本的window.postMessage就換成window.parent.postMessage來發訊息

這樣有個好處是這樣做不管是原本的chrome或firefox也是可以正常工作的

3. icon popup的window.close不管用

window.close在一般頁面上只要不是由js去開啟的頁面,都會不允許你使用window.close去關閉

但這個限制在chrome跟firefox的extension上不適用於icon popup page,所以在popup page內直接使用window.close可以正常關掉popup

但是在safari就比較嚴格,他在popup內也有這個限制,因為iframe內有換頁的需求,切換頁面也會導致這個問題而不能關掉popup

最後我的寫法是iframe內的路由我重新規劃都統一使用window.location.replace來換頁,這樣一來每頁都算是js開啟的頁面,自然而然popup的window.close就能作用了

只是這個做法就是要把iframe內所有會換頁的連結都改成這個方法,真的是有點累,但是之後只要都遵循這個原則就沒問題,chrome跟firefox也是通吃

4. 要給別台macos debug的問題

這個問題主要是我自己一開始不知道xcode的發佈流程,一開始是用開發者的憑證去簽app,結果發現到其他台macos會說開不起來,後來查到要用Developer ID去簽這個app

但是簽完後還要傳上去給apple公證,之後就是匯出,匯出之後又發現,安裝之後的彈出視窗他有一個預設按鈕點了沒有反應,後來才知道是要放到macos內的應用程式才會正常跑

ex. 結論

整個轉換過程其實很無痛,xcode有個工具可以直接將chrome extension轉換成safari extension,除了以上踩到的坑之外,其實也沒遇到什麼問題

比較頭痛的點大概就是專案的資料夾結構要考慮一下,因為他會建立一個xcode用的專案資料夾xd

最近在關注Cardano這個項目,也開始在Cardano鏈上看一些有潛力的NFT來收藏

所以這篇來整理有哪些工具可以方便分析Cardano NFT的價格跟稀有度那些的,不過這篇其實只是防止以後書籤不見拿來記錄的,順便分享給大家

最近有新增cardano上的cnft交易所整理 有興趣的可以點擊了解 Cardano NFT 交易所 整理 CNFT

本文所提之內容僅供參考,不具投資建議,投資前應審慎評估風險


CNFT.IO

CNFT.IO

這個是Cardano鍊上應該算目前最大的nft交易市場,雖然現在還沒有支援智能合約,只能先用註冊帳號的方式來使用,除了有時候會有bug以外,基本上都會正常使用,而且出了問題ada也是都會退

之後好像會支援智能合約,就讓我們拭目以待XD

POOL.PM

pool.pm

然後這一個是我覺得只要是Cardano使用者都應該要使用的網站,因為太好用,功能有點像block explorer,但整個介面就很好用,而且還支援質押池篩選,右上角也有一個nft按鈕可以直接看現在大家在交易或者在mint什麼nft項目

還可以搜尋自己的地址看自己的擁有的nft,真的是超級方便

CNFT.TOOLS

cnft.tools

這個網站非常好用,可以拿來看稀有度跟目前的價格,而且支援排序,像我如果要找地板價的nft我就直接把條件選成價格低到高來找,搜尋出來的結果還可以看這個價格帶的稀有度來看自己要來買哪一隻

另外他也知道直接搜尋id,如果不確定自己買的稀有度是多少的話,可以直接輸入id,然後搭配稀有度排序就大概可以知道自己這隻大概可以賣多少

這網站的缺點就是不是全部項目都支援,但目前社群比較大的項目,上面都有,所以我覺得很不錯,如果以後可以有查看交易歷史紀錄的功能那應該會更好用

cnftanalytics.io

cnftanalytics.io

這個網站是我拿來看最近賣最好的項目的網站,他支援幾個時間段,我最常用的應該是24小時跟過去七天,讓我大概可以知道大家在買什麼,不過這網站可能現在比較少用了,現在都換成下面要介紹的那個

opencnft.io

opencnft.io

現在看最近大家買什麼,都看這個網站,這個網站可以看到他項目前面還有圖片可以看,而且也是支援時間段篩選,這個網站比較特別的是一些還不知道名字的項目,如果大家也都在買的話,他也會出現在上面,只是項目名稱會變成Policy Id

cardanocube.io

cardanocube.io

這個是我拿來找特定服務項目用的網站,只要是Cardano上的項目他都會幫你分類好用途,要找特定服務的時候滿方便的

TokenRef

TokenRef

這個網站跟cnft.tools一樣是可以拿來搜尋cnft的工具網站,但這網站有一個功能是可以看到cnft的購買紀錄,所以有時候我要買之前也會先來這邊看一下,不過這邊更新項目的速度就比較慢,但是功能也比較完整

Twitter

最後就是這個,沒錯,就是推特,幣圈每個項目幾乎都會在推特上面更新他們的動態,所以建議可以申請一個推特帳號來追蹤這些項目,來外可以用#cnft這個hashtag來搜尋有關於cardano nft的相關項目喔!

結論

這些是我最近自己常用的網站,如果之後有發現更好用的網站也都會更新上來

如果這些內容對你來說有幫助的話,如不吝嗇可以贊助我一些小費,讓我有繼續下去的動力

ada address: addr1qy2kyf9jt29k7np32dlj77a7h2apvcd7t54tdsln3twrprk2c0d87a44hyk0ku92e2ykf3zey78ee5zxukvnu3x4yr0q9mhnak

之前上了狂派plus2之後就有再想要不要買條2.5升級線來試試看平衡的聽感,最後就等到有免運跟一堆奇怪優惠的時候入手了這個漢聲2.5升級線

開箱

漢聲 升級線

外面的盒子,印著一個很明顯的漢聲字樣

漢聲 升級線

打開之後就是這樣很簡潔,直接就是線放著,沒有多餘的裝飾

漢聲 升級線

聽感分享

由於目前手中只有final a4000可以換線,所以這次就選了cm接頭的2.5平衡頭版本,配的當然是小尾巴狂派plus 2,畢竟這條線有一半是為了這個小尾巴買的XD

接上去聽的第一個印象就是,左右分離得很開,聲場變成橢圓形,跟3.5頭的差別還滿多的,這個是我第一次聽平衡頭,真的是驚艷到我了,而且跟A4000真的是超配的

不知道是不是線的關係,整個有推開來的感覺,原本3.5配狂派就覺得很不錯了,換了2.5之後整個聲音更加透徹

除了聲場變大之外,最大的變化應該是樂器聲有變得更明顯,原本的話可能像人聲站很前面,然後樂器都擠在後面,換這條線之後就變成人聲站得更近,但是後面的樂器有分散開,比較可以分明樂器的聲音那種感覺,而且主要人聲的特點也沒有因此被削掉,如上面說的,我感覺人聲有更近的感覺

不過整體聲音還是比較偏中高音,這個應該就是A4000本身的特點了,聽完之後我大概不會再換回去3.5了哈哈

結論

比較可惜的是我手上只有A4000可以來測這條線,之後如果有買其他一樣是cm接頭的耳機會再更新上來

不過這個真的讓我滿滿意的,不過由於是第一次換線然後又上平衡的關係,所以我不確定這些升級的感覺有哪些部分是因為線有那些部分是因為平衡

作為入門我覺得這條線真的不錯,我自己是在蝦皮買的,等到免運跟一堆活動之後買這條線我是覺得滿ok的

蝦皮上面還有買其他版本的頭,這個可能就要自己去找找看了

我是在這邊買的: [ 傳送門 ]

最近在想入耳機坑這麼久也是時候來買小尾巴了,但因為疫情的關係所以就不太能去耳機店試聽,所以只能爬文雲試聽了XD,後來挑來挑去就選了這支狂派PLUS2,主要是因為他自己有2.5平衡孔可以用,之後要升級線也是很方便

DAC本體

狂派plus2

狂派PLUS2的盒子就小小的,如圖所示就是一個簡單的黑色盒子,上面印有狂派的LOGO

狂派plus2

裡面的配件就是狂派PLUS2自己跟三個轉接頭,分別是type-c轉type-c、轉蘋果規格type-c轉lighting,還有一個應該是讓你接電腦用的USB-A otg

狂派plus2

本體就長這樣,小小隻的,大概跟食指差不多常而已

狂派plus2

然後就是他有支援3.5mm跟2.5mm平衡

實際使用聽感

這隻是我第一隻小尾巴,所以我也不太能比較其他小尾巴的聲音,只能說說跟直推的差別

以下都是我在公司用這隻狂派PLUS2推下面幾隻耳機一個禮拜的心得,但是我沒有2.5的平衡線所以下面都是用3.5來測試,等之後有2.5的線我再來補充平衡的部分

Final A4000

先來說說a4000在用這隻小尾巴推的情況下的差別,因為聽說a4000是比較需要推的,雖然直推的時候我覺得聲音就滿不錯的,但我還是想發揮a4000的潛能

首先第一個印象是,解析度變高,然後高頻延伸更遠,聲音更立體,還有就是人聲這塊更突出了,中高頻這塊整個凸出來xd,低頻的部分我覺得有比較Q但是跟直推比差距不太大

不確定中高頻凸出來這部分是a4000本來上擴就會這樣還是狂派plus2有特殊加成,不過整體來說我覺得升級感滿大的,因為a4000我就是買來聽流行樂跟女聲的,所以我覺得整個就上了一層BUFF

2021/09/25 更新 我買平衡升級線了XD

我因為這條小尾巴所以買了一條2.5平衡升級線,有興趣的可以點擊連結去看一下,這篇就不贅述這部份了

微開箱 HanSound 漢聲 無氧銅鍍銀 24AWG 升級線

Denon C820

這隻是我拿來聽金屬跟搖滾的耳機,直推就可以發揮非常不錯的聲音,直到我前幾天在ptt耳機版上看到有人說C820沒上擴只有發揮30%,我看到這段話心想,這麼好聽的聲音竟然才發揮3成,這段話也是我會想去買小尾巴的主要原因之一XD

拿到狂派PLUS2的第一步,我就馬上把C820拿過來插進去試試看,第一首歌的第一個印象就是,吉他的刺激感好像沒有直推那麼爽,但是鼓跟BASS馬上就凸顯出來,還有就是人聲的部分也是整個圓潤了不少

感覺用了狂派PLUS2之後拿來聽金屬好像沒有直推的爽,但是他這個特性我就拿來試試看硬搖滾,發現相性非常的合欸,整個氣氛都更上了一層,真的是很不錯

雖然拿來聽金屬會感覺少了些什麼,但是拿來聽搖滾真的很不錯,剛好有點補足了C820在直推下的一些缺點

後來我又試了JPOP跟一些動畫歌,發現也是變得比較好聽,主要是因為聲音更暖了,所以聽起來更滑順,加上狂派之後C820變得有點萬能XD,這邊就要回到網友說的只發揮30%這句話,我聽完之後非常認同,雖然金屬的刺激感變少令我滿震驚的,但是拿來聽其他曲風的音樂就變得更順耳了

結論

我認為狂派plus2在音色上有比較偏現代人的口味,感覺有稍微強調中高頻的部分,但整體來說還是滿乾淨的,主要都還是耳機在發揮,我覺得還算不錯

不過有點可惜的是我沒有2.5的線可以聽QQ,以後有換線的話A4000那部分我會再補一些平衡的聽感(好像換線阿QQ)

我自己是日常使用firefox當瀏覽器的人.之前就有遇到spotify的網頁版撥放器在firefox好像會讀取錯誤,之前就有研究一下,最近有朋友有遇到這問題,所以我乾脆寫篇文章上來紀錄

解決辦法很簡單,到spotify的網頁撥放器頁面按下f12或者去選項開啟開發人員工具

然後最上方的tab選擇應用程式,之後就會看到以下畫面 spotify firefox service worker

這個就是spotify註冊的service worker,右上角有個取消註冊,按下去之後重整就正常了,雖然我不知到為什麼只有firefox會有這問題,但官方修復之前也只能這樣做了

最近看到PTT上有討論這隻耳機,而且剛好也想要一隻用來聽人聲的耳機,所以我就直接去耳機店聽了這一隻A4000,後來一聽覺得很喜歡,所以我就直接入手了,之後就每天在公司邊聽邊RUN,就這樣RUN了兩個禮拜應該也是有100個小時了,來做個小分享

開箱

final a4000

外盒,實際上比用看的還要大盒,差不多跟一個筆電的寬一樣高

fianl a4000

打開來就是像這樣,右邊就是耳機的收納盒跟收納耳塞的盒子

fianl a4000 box

收納盒,出廠是被套著的

fianl a4000 box

仔細看上面是有final的logo跟文字,整個盒子是矽膠,但摸起來非常舒服滑順

fianl a4000 box

盒子的底下,要從這邊打開

fianl a4000

打開之後就能看到耳機本體啦

fianl a4000

拿出來感覺就像這樣

fianl a4000

fianl a4000

對耳機本體的第一個印象就是方方正正的,而且超級輕

fianl a4000

付的耳塞有五組大小可以選,而且這就是傳說中的e套嗎,第一次看到QQ

耳機本體

Final A4000比想像中的還要輕,因為之前買的耳機一拿在手上都有沉的感覺,但這隻意外的輕盈

而且e套我已經看大家講很久,都說便宜的final耳機都是買e套送耳機,這次終於見識到傳說中的e套e套真的很舒服很貼耳,終於知道為什麼大家都推薦e套

然後 Final A4000要耳掛戴起來會比較穩,由於他很輕所以戴上去沒什麼負擔,要說缺點的話就是那個線真的好細,我都怕一個太用力會斷掉….

開聲

Final A4000開聲高頻有點刺,而且應該是我直推的關係,聲音好像有隔一層布的感覺,音場偏小,人聲比較貼耳,跟我之前買的C820完全相反XD

但是聲音銜接滑順,第一個印象以腦補的場景來說的話,這隻耳機給我的感覺是主唱的位置是在很前面,然後樂器都在離主唱後面有點距離的地方演奏,感覺樂器的排列很擠,但也不是說會雜在一起,大概這樣的感覺

低頻的部分是可以理解別人說這隻沒有低頻,但我覺得還是有,但是就沒有下潛,敲鼓很像在敲比較重的鐵皮的感覺

因為這次主要是找人聲塞,所以我是覺得很滿意,畢竟不滿意就不會買了吧XD

聽了兩個禮拜的心得

從買來之後就是每天帶到公司聽,在公司聽6小時,大概就這樣聽了兩個禮拜,應該也是有超過100小時了,所以來分享一下區別

第一高頻會刺這點,在邊聽邊run的過程中,大概20小時就會比較好,會變成比較自然的感覺,低頻的話我自己感覺是一樣薄弱xd

但是隔一層布的感覺有變得比較好,雖然說還是有,但我感覺聽起來有比較好一點,可能之後還是會買小尾巴來推推看

再來就是人聲的部分了,A4000的人聲我自己覺得開聲我就很可以,run到現在我覺得有更上一層的感覺,人聲說不上甜,應該說是比較自然,但是那個銜接非常滑順,很像聲音外面包著絨毛一樣,不甜但是非常舒服

音場的部分我自己覺得跟開聲的時候差不多,樂器跟主唱的位置就像上面講的那樣,這點沒有不好,我反而覺得可以跟我的C820互補

結論

我認為A4000戴起來非常舒服,拿來聽人聲,特別是女聲很適合,雖然沒那麼毒,但是聲音很自然,是可以戴著聽很久的類型

以我自己來說的話現在要聽金屬我就是戴C820,如果要聽ACG這隻A4000就是我的首選

之後有買小尾巴來推的話也會來更新心得

2021-8-14更新 我買了小尾巴了XD 可以點這邊看加上小尾巴的心得

2021-09-25更新 我因為小尾巴的關係,所以買了一條2.5升級線XD 可以點這邊看升級線的心得跟開箱

對這隻耳機有興趣的話,也能透過我的連結直接去購買喔: Final A4000

自己之前有遇過這問題,雖然只要開一個分頁就沒問題,但還是會有些不方便,所以就有上網找一下怎麼解決,後來就有找到問題所在,也順利的解決了,現在使用就跟之前一樣無障礙

我自己是用linux Mint我不確定是不是只有這個os會有這個問題,但我看ptt還是其他論壇都沒有人有這問題,所以我先記錄下來

我自己是在某次chrome更新之後才有這個問題,而且不只chrome,只要是chromium系列的瀏覽器都有這問題,像是brave跟新版的edge

解決方法是只要關掉硬體加速就可以解決這問題,下面講一下主流瀏覽器關閉硬體加速的方法

chrome

先到設定頁面,或網址直接打chrome://settings 也能進去

然後直接在網址列上面打硬體加速就可以直接找到選項,之後就是直接把它關掉重開

或者點左側的進階->系統 也可以找到這選項

Brave

brave的做法其實跟chrome差不多

一樣到設定頁面或網址打 brave://settings

進去之後左上角有一個放大鏡,點下去可以搜尋,一樣找硬體加速也能找到選項

不想用找的一樣左側的額外設定 -> 系統 也能找到

Edge

這邊的edge是指新版本的edge喔,因為新版的才是chromium

操作方法大同小異,進入設定頁或輸入網址 edge://settings

然後左上角有一個很明顯的搜尋框,一樣直接搜尋硬體加速

不用搜尋的左側直接點系統也能找到選項

結論

雖然這情況很少人遇到,但真的遇到還真不知道該怎辦,所以特別寫這文章記錄一下,不然又要繞一圈國外的論壇(汗

分享一下我平常開發瀏覽器插件的時候常用來優化架構的方式,並做個筆記,讓自己以後可以比較快想起來

使用打包工具

第一種方式就是使用像webpack這種的打包工具,這部分我有在另一個文章有分享過,有興趣的可以點過去看看

使用webpack強化chrome瀏覽器套件的開發體驗

使用type=”module”的script

第二種方式就是用現在瀏覽器就原生支援的type=”module”,用這個最大的好處就是你不用去配置各種環境,馬上就能進行開發,缺點就是你程式碼都要包裝成esm的格式,不過我自己是滿習慣這種開發方式,雖然這樣做不太好利用到npm的生態系,但非常的方便,而且不會讓整個架構胡再一起,在做小專案的時候我都用這種方式

caniuse

而且主流可以裝插件的瀏覽器都支援這個方式(終於不用考慮IE^^)


在background使用

在background使用最簡單的方式就是你把extension的background入口指定成html,html內再把你的script加上type=”module”,這樣你整個background的環境就可以用esm的方式包裝你的模組

首先建立一個html檔案,檔名隨便,反正等下指向的時候取什麼名字就指向什麼,我習慣叫做background.html

然後新增你的script,type給他module,放到body或head內,這樣瀏覽器就會把你的script當成es module來看

像是這樣

然後在manifest.json的background選項加上page參數,參數指向上面的html檔案

1
2
3
"background": {
"page": "background.html"
}

這樣子就完成background的設定了,在popup或者option內都能這樣做,但是content_script由於不能指定他是type=”module”,所以做法不一樣,這個稍後在講


現在你可以試試看esm的魔力

跟著做以下範例

util.js

1
2
3
4
5
6
7
8
9
export function hello() {
console.log("Hello world")
}

export function sayHello(name) {
console.log(Hello ${name})
}

export default {hello, sayHello}

background.js

1
2
3
4
5
6
7
8
// 這邊路徑要看你util.js放哪裡
import {hello, sayHello}, util from "./util.js"

hello()
sayHello("The World")

util.hello()
util.sayHello("Jojo")

順利的話裝完插件打開background的console就會看到印出四行字


在content script中使用esm模組

在content script中比較麻煩,由於他只能直接掛上去,沒有script可以改,所以要繞一下

通常來講有兩種方式,第一種就是你用content去建立一個script tag插入到document中,這樣你就可以指定他是type=”module”

第二種方式就是dynamic import用動態的方式去載入模組


1. 建立一個type=module的script tag

content.js

1
2
3
4
5
6
const url = chrome.extension.getURL("./content.esm.js")

const script = document.createElement("script")
script.type = "module"
script.src = url
document.body.append(script)

content.esm.js

1
2
3
import util from "./util.js"

util.hello()

就像上面這樣,你把要執行的邏輯放到content.esm.js然後透過content.js去注入到document內

這樣做的缺點是,由於的你程式碼是注入到網頁的執行環境上,所以你不能用瀏覽器的runtime API,你要跟background通信就需要在content.js那邊再用一層之類的

而且由於他是要放到網頁上載入的,你的content.esm.js就還必須在manifest.json定義web_accessible_resources這個參數,不然瀏覽器不會讓你去讀取他


2. 使用dynamic import動態載入esm模組

這個方式也是我自己比較喜歡使用的方式,主要是因為我就不用再包一層通訊,而且也能直接使用瀏覽器的API

動態載入就是用import()這個方法來載入你的esm模組,建議可以搭配async來使用,使用體驗非常好

content.js

1
2
3
4
5
6
7
8
9
10
11
12
13
async function useImport() {
const util = await import("./util.js")
util.hello()

// 如果是想使用export default出來的
util.default.hello()
}

// or

import("util").then(util => {
util.hello()
})

個人是建議搭配async來做使用,但是這種方式也有很大的缺點,那就是要搭配async的話,代表你的方法都要是async除非你不care同步問題,就算不用async直接用then去拿,你的程式碼結構就會被侷限在這種格式上面

而且最大的缺點就是每當我要某個方法內使用某個模組的時候,我就必須要呼叫import()來載入模組,你有好幾個方法要依賴這個模組你就每個方法都要用import()把她載入

我自己的解法是我在執行其他邏輯之前,把可能很多方法都需要用的模組都載入到全域變數上,這樣之後要用的時候直接取全域變數就好,不需要再載入

1
2
3
4
5
6
7
8
9
10
11
12
function useImport() {
window._modules.util.hello()
}

window.addEventListener("load", async () => {
window._modules = {}

window._modules.util = await import("./util.js")

// 以下再做其他邏輯
useImport()
})

只是這樣就如上看到的,你光要呼叫一個方法名字就有夠長,而且對於某些使用場景,這樣依賴全域變數也不是辦法


結論

總之我在工作或自己的專案上都使用第二種方式來載入content script的esm模組,如果有發現更好用的做法一樣會更新上來

0%