Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124

isChinaUser 是純前端的開源地區偵測庫,靠語言、時區、Emoji、中文字體與可選網路探針判斷,不查 IP。本文從原始碼拆解三個關鍵:預設把台灣、香港、澳門也視為中國用戶(需加 mainland:true 才限縮中國大陸)、沒有授權條款(NO LICENSE)、以及它只適合前端展示分流、不該當風控唯一依據。
用 AI 摘要這篇文章:
isChinaUser 是一套不依賴 IP 的純前端地區偵測庫,但它預設會把台灣、香港、澳門的使用者也算成中國使用者,這是台灣開發者裝它之前最該先知道的一件事。它還有兩個容易踩雷的地方:沒有授權條款、不適合做風控,下面分別講清楚。
TL;DR:isChinaUser(GitHub:yArna/isChinaUser,npm:is-china-user)是純前端的地區偵測庫,靠語言、時區、Emoji、中文字體、可選網路探針判斷,不查 IP。它的預設行為是「兩岸四地都視為中國用戶」,台灣、香港、澳門都會回傳 true;只想限縮中國大陸要加
{mainland: true}。它也沒有授權條款(NO LICENSE),而且不適合做風控的唯一依據。
目錄
這是台灣開發者最該先搞清楚的一點。作者在原始碼 src/index.ts 的註解裡寫得明白,預設情況下中國大陸、台灣、香港、澳門都視為中國用戶。換句話說,預設的 isChinaUser() 判斷的是「大中華文化圈」,不是只有中國大陸。
從測試檔可以印證這件事:瀏覽器語言是 zh-Hant(繁體中文),isChinaByLanguage() 預設回傳 true;系統時區是 Asia/Taipei,isChinaByTimeZone() 預設也回傳 true。結果就是,預設設定下的這個庫會把一個台灣使用者歸成「中國用戶」。如果你的目的是只針對中國大陸境內分流,直接用預設值會把台灣、香港、澳門的使用者也一起算進去,得加上 {mainland: true} 選項才會排除繁體中文與 Asia/Taipei 這類訊號;另一個 {strict: true} 選項則只看最高優先的語言、不再退到 UTC+8 的時區 fallback。這是作者刻意的設計選擇,不是 bug,但用之前一定要知道,否則你的「中國境內分流」會連帶影響一批台灣與港澳使用者。

isChinaUser 組合了五類瀏覽器特徵。語言讀 navigator.language 與 navigator.languages,只要清單裡任一項是中文就算命中;時區讀 Intl.DateTimeFormat().resolvedOptions().timeZone,命中 Asia/Shanghai 等已知時區,找不到時會退到 UTC+8(這也是 Asia/Taipei 被算進去的原因);Emoji 渲染利用不同系統對特定 Emoji 畫法的差異做輕量設備識別;字體偵測透過 Canvas 測試 DengXian、仿宋、等線這類常見中文字體是否存在;最後是一個可選的非同步網路探針,靠幾張探針圖片的可達性輔助判斷網路出口。前四個是本機就能讀到的訊號,第五個要你手動呼叫才啟用。
判斷邏輯是任一訊號命中就算數。語言、時區、設備特徵只要有一個像,就回傳 true(Windows 系統會跳過設備特徵那項)。這個 OR 邏輯讓它很靈敏,但也帶來誤判:海外華人使用者的瀏覽器可能裝了繁體中文、時區設在居住地、系統又剛好有中文字體,就可能誤判成中國用戶;反過來,使用者只要把系統語言改成純英文、時區改掉、移除特定中文字體,即使身在中國大陸,這個庫也抓不到。作者在 README 直接列了「如何避免判斷為中國用戶」的步驟,等於自己也承認這些訊號能繞過。實際用起來,把它當「大概」的判斷可以,當「精準」的判斷不行。
實際部署很輕。用 npm 把套件裝進前端專案後,引入它提供的 isChinaUser 函式,就能在頁面或元件裡呼叫。它預設是同步的,讀完本機訊號就回傳布林值,不必等網路、不卡畫面渲染;那個網路探針是另一個非同步方法,要你明確呼叫才會跑,平常不會動到。對靜態站或純前端部署的文件站來說,這種「不必動後端、一個函式就能判斷」的整合門檻很低,這也是它相對於服務端 GeoIP 的主要賣點。不過輕量是有代價的,你換來的是精準度與抗繞過能力都輸一截,這個取捨在選型的時候要想清楚,尤其當你的產品對判斷正確性有較高要求時,更要把它當成輔助而不是主判斷。
isChinaUser 回傳的只是一個布林猜測,離精準定位差很遠,更撐不起帳號風控那種責任。它讀的全是瀏覽器自願揭露的環境特徵,而這些特徵使用者改得起、隱私瀏覽器也擋得掉。拿它來擋付款、封帳號,或當作能不能使用某個功能的紅線,都太冒險。
比較合適的位置,是把它當成前端展示邏輯的輔助訊號。例如文件站給疑似境內使用者顯示 CDN 鏡像入口、SaaS 官網根據環境切換服務可用性說明、跨境網站做輕量的內容分流。真正涉及資料合規、跨境限制或帳號安全的判斷,別讓一個前端布林值扛,交給服務端的 IP 查詢加上你自己的業務規則去定,前端這個訊號頂多用來調 UI。如果你會在意被偵測的那一方,在把資訊送出去之前先過濾敏感內容 的做法值得參考。
具體一點的情境是這樣:假設你做一個開源專案的文件站,主站放在國外的 CDN,中國大陸讀者連線慢,可以在前端用 isChinaUser 判斷後,提示他們改走境內鏡像站;又或者一個 SaaS 產品的官網,對中國大陸市場有些服務項目不能提供,可以在偵測結果為中國用戶時顯示對應的合規說明,而不是直接把整個功能藏起來。這類用途的共同點是:判斷只影響「顯示什麼」,不影響「能不能用」,就算誤判也只是一段提示文字不對,不會造成實質損害。一旦你想拿它做「擋住某些人不能用」,就踩進了它撐不住的責任範圍。
isChinaUser 的原始碼公開在 GitHub、套件也上了 npm,很多人會直覺以為「開源就能用」。但它的 package.json 裡 license 欄位是空的,倉庫裡也沒有 LICENSE 檔案。在沒有授權條款的情況下,法律上預設是「版權所有(All Rights Reserved)」,你能 npm install 把它跑起來,但嚴格說來,修改、再散布、或把它整包塞進自己的商業產品裡,都沒有獲得明確授權。

這不是作者惡意,很多個人 side project 會忘了加授權。但對商業專案來說,使用未授權的程式碼是法務上的灰區。真要用在正式產品,比較穩當的做法是先到 issue 區問作者能不能補授權,或改用有明確條款(MIT、Apache、BSD)的同類方案。這個「公開不等於授權」的觀念,在 Agent Battery 談 NO-LICENSE 授權誠實軸 那篇也討論過。
隱私這一面要分兩層看。正面的是,isChinaUser 預設只讀本機瀏覽器訊號,不主動發網路請求、不把資料往外送,這點和很多會偷偷連回家的工具不同;那個網路探針是可選的,你不手動呼叫就不會跑。從「不外送」這個角度看,它的隱私邊界相當清楚,可以對照 OpResume 那種預設完全不連網的純前端工具。
另一面是,它讀的語言、時區、Emoji 渲染、Canvas 字體,正好就是瀏覽器指紋技術常用的那幾樣東西。isChinaUser 用這些訊號做的是「你是不是特定地區使用者」的判斷,但同樣的訊號也能被拿去做更侵入式的追蹤。事實上已經有一個叫 am-i-chinese 的防禦側姊妹專案,專門審計你的 AI coding agent 有沒有被偷偷標記成中國人,可見這套偵測技術已經有人從反制角度在關注。所以 isChinaUser 本身是中性的工具,但它操作的技術屬於指紋這一類,使用時心裡要有底。
這些指紋訊號在隱私意識較強的瀏覽器上會進一步失效。Brave、Firefox 的嚴格隱私模式,或 Tor Browser,都有 Canvas 指紋防護,會干擾字體與繪圖偵測;有些瀏覽器也容許偽造或遮蔽時區與語言清單。也就是說,愈是注重隱私、愈可能同時用 VPN 與指紋防護的那群使用者,isChinaUser 在他們身上就愈不準。如果你的目標使用者剛好是這群人,這個庫的判斷結果參考價值會更低,這也是它在實務上只能當參考、不能拿來做關鍵判斷的根本原因之一。
isChinaUser 和傳統 GeoIP 是互補關係,不是替代。GeoIP 在服務端查 IP 歸屬地,結果相對精準、不容易讓前端繞過,但需要後端資源與資料庫維護;isChinaUser 在前端跑、不必動後端,部署成本低,但精準度差、使用者改一改環境訊號就能繞過。實務上常見的搭配是:前端用 isChinaUser 做即時的展示分流,像是要不要顯示境內鏡像入口;後端用 GeoIP 做關鍵的合規與風控判斷,兩邊結果對不起來時以服務端為準。把判斷責任全壓在前端這個能繞過的訊號上,是這類工具最常見的誤用,出事時你也沒有服務端日誌可以回頭查證。
npm 套件可以免費安裝,但它沒有授權條款(NO LICENSE),嚴格說並不等於開放授權。商業專案要用,建議先向作者確認或請對方補授權。
預設會。作者原始碼註解明說預設涵蓋中國大陸、台灣、香港、澳門。只想判斷中國大陸,要加 {mainland: true}。
不準到能做風控。它靠的是可被修改的環境訊號,作者自己也列了避開偵測的方法。適合做前端展示分流,不適合當支付風控、帳號封禁或合規判斷的唯一依據。
預設不會,只讀本機瀏覽器訊號。那個網路探針是可選的非同步方法,要你手動呼叫才會載入探針圖片。
GeoIP 在服務端查 IP 歸屬,較精準但要後端資源;isChinaUser 在前端靠環境訊號判斷,不需後端,但精準度差、可被繞過。兩者互補,不是替代。
有,作者在 GitHub Pages 放了線上測試頁,打開就能看到你目前這台設備在語言、時區、字體等維度的偵測結果,裝套件前可以先去體驗它判得準不準。
如果你做的是出海專案或跨境網站,需要一個不必動後端的輕量前端判斷,isChinaUser 是順手的工具。裝之前最值得花十秒確認的是你要的是兩岸四地還是只限中國大陸,後者記得加上 mainland 參數;授權條款和只當輔助訊號這兩點,前面章節已經講過。否則你的中國境內分流,會默默把一批台灣與港澳使用者一起算進去。裝完也建議先在自己的開發環境跑一次,看看它怎麼判你這台機器、會不會誤判,畢竟它的結果會因為你的語言、時區、字體設定而不同,實測一次比只看文件更踏實。