Egret 如何發布Source Map

Javascript代碼在發布到線上時都會做些處理,如使用UglifyJS2,可顯著減少文件大小,并且能降低些許代碼的可讀性。帶來的不良后果是,調試起來就不是很方便了,拋出個異常也很難分析出是哪個文件,哪個地方報錯了,這個時候主角登場:Source Map

進入正題,Egret項目使用TypeScript進行開發,TypeScript項目在發布的時候會有以下兩個步驟:

  • 1、TypeScript --> Javascript
tsc --sourceMap --outFile main.js file.ts file1.ts
  • 2、Javascript --> ugly Javascript
uglifyjs main.js --source-map main.js.map --in-source-map main.js.map

以上兩個步驟都可以產生SourceMap,步驟二使用到了步驟一生成的SourceMap,用了參數--in-source-map

Egret 發布項目的命令egret publish事實上就包含了上面的兩個步驟,但對sourceMap的支持有些問題,所以做了一下修改。
先定位到當前EgretEngine的地址,一般是:
/Applications/EgretEngine.app/Contents/Resources/mac/egret
也可以通過下面的方式找出:

ls -l `which egret` 
#輸出:lrwxr-xr-x  1 root  admin  39  3 15 15:39 /usr/local/bin/egret -> /usr/local/lib/node_modules/egret/egret
cat /usr/local/lib/node_modules/egret/EgretEngine
#輸出:/Applications/EgretEngine.app/Contents/Resources/mac

主要修改了兩個文件:

  • tools/lib/utils.js
    替換掉minify方法
function minify(sourceFile, output) {
    var defines = {
        DEBUG: false,
        RELEASE: true
    };
    //@terran
    //UglifyJS參數參考這個頁面:https://github.com/mishoo/UglifyJS2
    // var result = UglifyJS.minify(sourceFile, { compress: { global_defs: defines }, output: { beautify: false } });
    var option = {
        compress: { global_defs: defines }, 
        output: { beautify: false }
    }
    if(file.exists(sourceFile+".map")){
        console.log(sourceFile+".map");
        option.outSourceMap = path.basename(sourceFile+".map") 
        option.inSourceMap = sourceFile+".map"
    }
    var result = UglifyJS.minify(sourceFile,option) 
    file.save(output, result.code);
    file.save(sourceFile+".map", result.map);
}
  • tools/lib/uglify-js/uglifyjs.js
    放開了MOZ_SourceMap的注釋
var UglifyJS = vm.createContext({
    sys           : sys,
    console       : console,
    MOZ_SourceMap : require("/usr/local/lib/node_modules/source-map")
});

此處用了到source-map,需要使用npm安裝下:

npm install source-map -g

最后發布egret項目時,使用命令:

 egret publish --sourceMap true 

便會生一個js.map文件,并且在生成的js的末尾也加了//# sourceMappingURL=main.min.js.map

齊活

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • NAME dnsmasq - A lightweight DHCP and caching DNS server....
    ximitc閱讀 2,930評論 0 0
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,933評論 18 139
  • 周日,今早三弟來電話本來侄子發燒不能回老家了,又想今后幾天不知天氣怎樣,還是一同回家;又接到郭仁峰校長的電話,他岳...
    星之夢lyx閱讀 230評論 0 0