Sublime Text 之運行 ES6 (基於babel)


本文同步自我的個人博客:http://www.52cik.com/2015/10/21/sublime-text-run-es6.html

之前在博客園里寫過一篇《Sublime Text 之運行 js 方法》,這篇算是續篇了,因為就是改個字符串而已。

直接進入正文吧。

安裝Babel

$ npm install -g babel

好了,沒什么好說的。

由於babel發布了第6版本后,安裝babel無效,官方提示安裝babel-cli,但運行時錯誤,暫時不知道怎么處理,所以安裝老版本先。

$ npm install -g babel@5.8.20

創建Sublime Text編譯系統

選擇菜單 **Tools --> Build System --> new Build System... **

中文版的話是 工具 --> 編譯系統 --> 新建編譯系統...

然后寫如下配置:

{
    "working_dir": "${project_path:${folder}}",
    "selector": "source.js",
    "encoding": "utf-8",
    "shell": true,
    "windows": {
        "cmd": ["taskkill /f /im node.exe >nul 2>nul & babel-node \"$file\""]
    },
    "osx": {
        "cmd": ["killall node >/dev/null 2>&1; babel-node \"$file\""]
    },
    "linux": {
        "cmd": ["killall node >/dev/null 2>&1; babel-node \"$file\""]
    }
}

接着保存為 javascript.sublime-build,保存位置默認即可。

好了,現在你可以寫 es6 的代碼測試下了,下面是運行效果。

mac

mac 效果

win

win 效果

運行失敗處理

當然也有運行不了的情況,不過大體就分為下面幾種情況。

Sublime Text 以下簡稱 st

  • Sublime Text 2 為 st2
  • Sublime Text 3 為 st3

一. 環境變量

如果執行不了,而是報錯,錯誤類似 xxx babel-node: command not found 這樣的,那么就是環境變量的問題。
只要添加下 nodebabel-node 的路徑到環境變量里。

如果是mac下,我推薦添加 path 屬性到你的 javascript.sublime-build 里,會更方便。

{
    "path": "/usr/local/bin",
    "working_dir": "${project_path:${folder}}",
    "selector": "source.js",
    "encoding": "utf-8",
    "shell": true,
    "windows": {
        "cmd": ["taskkill /f /im node.exe >nul 2>nul & babel-node \"$file\""]
    },
    "osx": {
        "cmd": ["killall node >/dev/null 2>&1; babel-node \"$file\""]
    },
    "linux": {
        "cmd": ["killall node >/dev/null 2>&1; babel-node \"$file\""]
    }
}

就類似這樣,mac 下就可以運行了。 win 下安裝 node 默認就添加到環境變量了,所以不需要考慮這樣的問題。

二. 含有中文路徑 (僅win)

當路徑里出現中文的時候,win 下什么都不會輸出,好奇怪,我也不知道為什么,但 mac 下可以正常運行。
他們唯一區別只是環境字符集一個默認是 gbk,一個是 utf-8,難道只是這個問題?
如果有哪位大神知道,還望指點一二。

st2不正常 st3正常

三. 中文用戶名 (僅win)

如果你的系統用戶名是中文的,我指的是系統登錄的用戶名,如果是中文的,那么怎么都運行不了,奇怪了。
一開始我以為是 C:\Users\用戶名\AppData\Roaming\npm 這個問題,但是我修改了 npm 安裝目錄,問題依舊。
暫時沒想到好的處理方法,最直接有效的解決方法就是換英文用戶名。

st2不正常 st3正常

四. 支中文用戶+中文路徑 (僅st3)

目前為止,幾個朋友向我反應了運行失敗的情況,沒有中文路徑,不是中文用戶名,依然運行失敗。
我遠程調試了問題最多,最愛問莫名其妙問題的 @淫狐 同學的機子。
他是 win10+st3,英文用戶名,英文名路徑,遇到的錯誤是 "文件名、目錄名或卷標語法不正確"
更奇怪的是,他說之前能運行js的,但是安裝 babel 卻不能運行 es6。

我就糾結了,打開了他原先的配置,粗略看來都一樣,調試了幾次后發現問題就出在 cmd: 的參數寫法上。
st2 可以合並為一行寫參數,而 st3 卻不支持,只能拆開寫。

"cmd": ["taskkill /f /im node.exe >nul 2>nul & babel-node \"$file\""]

之前,我們是這么寫的,現在要改成這樣。

"cmd": ["taskkill", "/f", "/im node.exe", ">nul", "2>nul", "&", "babel-node", "$file"]

或者干脆這樣。

"cmd": ["babel-node", "$file"]

這樣就可以兼容 st3 了,而且支持中文用戶名支持路中文路徑
至於為什么要加是 taskkill /f /im node.exe >nul 2>nul,是因為當腳本耗時比較長,或者死循環的時候,你再次執行,可以自動結束之前的進程,這樣就免去了我們手動關閉進程的麻煩。

如果你本地要用 node 跑任務的,比如 gulp watch 之類的,那就不要加這了,否則你的任務就會被關掉。
所以,有得必有失,看情況取舍吧。

好了,來看下完整的例子。

{
    "working_dir": "${project_path:${folder}}",
    "selector": "source.js",
    "encoding": "utf-8",
    "shell": true,
    "windows": {
        "cmd": ["taskkill", "/f", "/im", "node.exe", ">nul", "2>nul", "&", "babel-node", "$file"]
    },
    "osx": {
        "cmd": ["killall node >/dev/null 2>&1; babel-node \"$file\""]
    },
    "linux": {
        "cmd": ["killall node >/dev/null 2>&1; babel-node \"$file\""]
    }
}

OK,這個兼容 ST3 不論是 win mac 還是中文用戶,中文路徑,都支持

后記

折騰了幾天,終於大致解決了所有問題,簡單說 st2 在 win 下只要有中文路徑,或者中文用戶,就無法運行,st3 則不受干擾,所以 st2 用戶可以考慮升級 st3。

其實我知道為什么用 st2,因為只有 st2 是 100% 漢化,st3 只有菜單漢化。我 win 上是 st2 漢化的,mac 上是 st3 英文的,由於習慣了,所以所有東西都知道怎么操作,現在來說,漢不漢化都無所謂了。反而升級 st3 不會遇到奇葩bug。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM