Cocos 3.x 構(gòu)建模板 向main.js添加代碼

一殊轴、問題

在OPPO平臺嚎杨,要接入一個打點SDK蓄喇,渠道只提供了JS版本发侵,需要將部分JS代碼添加到main.js中。


image.png
二妆偏、使用構(gòu)建模板build-templates

參考自定義構(gòu)建模板
可以在build-templates放一個已經(jīng)添加過代碼的main.js刃鳄,每次打包后,覆蓋過去钱骂。但是叔锐,如果在構(gòu)建面板勾選了MD5緩存,每次的main.js實際上是動態(tài)變化的:

...
System.import('./application.45421.js').then(({ createApplication }) => {
...

這樣覆蓋過去的main.js见秽,如果MD5碼有變動愉烙,就會導(dǎo)致覆蓋錯誤。

解決辦法也有解取,就是打包完成后步责,不要改項目任何配置,緊接著再打包一次禀苦,這樣兩次打出來的包因為無任何變化蔓肯,實際上MD5碼是不變的。步驟如下:

  • 第一次打包時振乏,清除build-templates目錄中的main.js
  • 在第二次打包之前蔗包,使用gulp腳本把第一次打出來的main.js添加上JS代碼,然后復(fù)制到build-templates目錄中昆码,緊接著第二次打包气忠,就可以正確覆蓋過去了。
三赋咽、重新打包rpk

思路就是每次打包完旧噪,使用gulp腳本把要添加的代碼復(fù)制到main.js當(dāng)中,然后重新壓縮一個rpk放到dist路徑中脓匿。

參考OPPO 小游戲 rpk 打包方法淘钟,但是使用quickgame subpack重新打包時出現(xiàn)了錯誤

image.png

這里是打main分包時,部分COCOS代碼引用不到陪毡。這條路走不通米母,就只能在COCOS打包過程中想辦法了。

四毡琉、使用COCOS插件
1.官方文檔 第一個擴展

這個很好弄明白铁瞒。然后大概看了以下教程,發(fā)現(xiàn)對我解決問題幫助不大桅滋。
CocosCreator3D插件教程 插件小王子
B站制作插件視頻:
https://www.bilibili.com/video/BV1Ya411w7iA
https://www.bilibili.com/video/BV11z4y1k7aZ
https://www.bilibili.com/video/BV1Bt4y1Y7q3
https://www.bilibili.com/video/BV15p4y1z7YW

2.官方文檔 擴展構(gòu)建流程

在編輯器的菜單欄中點擊 項目 -> 新建構(gòu)建擴展包慧耍,得到cocos-build-template插件身辨。
接著參考插件里的readme:

自定義構(gòu)建插件模板使用指南

首先歡迎體驗自定義構(gòu)建插件功能,這是一份自定義構(gòu)建插件的簡單模板芍碧,里面寫了一些簡單的添加構(gòu)建配置以及自定義鉤子函數(shù)的代碼示例煌珊,更多的用法可以參考官方文檔。

基本使用流程
  • 插件模板內(nèi)使用了一些 node 模塊方法泌豆,目前在 packages.json 內(nèi)添加了插件支持的模塊 types定庵,安裝后才能正常編譯通過以及得到更好的類型提示。
    npm install
  • 通過直接修改該文件夾內(nèi)的代碼踪危,編譯后蔬浙,再 擴展管理器 中找到對應(yīng)的構(gòu)建插件,然后點擊 重新載入 圖標(biāo)按鈕重啟插件即可贞远。
image.png

示例代碼使用 ts 編寫敛滋,在使用之前請先在當(dāng)前目錄下執(zhí)行 tsc 編譯代碼。如果直接在當(dāng)前文件夾內(nèi)修改使用兴革,可以執(zhí)行 tsc -w 監(jiān)聽編譯绎晃。

如果還不知道如何編譯代碼或者如何使用 ts 編寫,可以參考 TypeScript 的官方文檔杂曲。

在使用過程中有任何建議反饋庶艾,歡迎在論壇上和我們交流。

  • 啟用插件后打開構(gòu)建插件面板擎勘,選擇任意平臺咱揍,即可看到構(gòu)建插件注入的新參數(shù)。


    image.png
3.按照readme實踐中遇到的問題
  • npm install失敗棚饵,此時建議使用cnpm install
  • readme的package.json依賴如下:
    "dependencies": {
        "@types/electron": "^1.6.10",
        "@types/fs-extra": "^5.0.4",
        "@types/node": "^10.5.2"
    }

如果需要切換node.js的版本煤裙,可以參考
使用nvm解決gulp ReferenceError: primordials is not defined

  • 執(zhí)行tsc
    使用npm install -g typescript安裝完ts,然后在cocos-build-template路徑下執(zhí)行tsc命令
node_modules/_electron@12.0.9@electron/electron.d.ts:6647:21 - error TS2694: 
Namespace 'NodeJS' has no exported member 'Require'.

6647     require: NodeJS.Require;
                         ~~~~~~~
Found 1 error.

這里我將dependencies中的node升級到12.1.0,還是無法解決噪漾。最后先使用cnpm install安裝fs-extra和node

  "dependencies": {
    "@types/fs-extra": "^5.0.4",
    "@types/node": "^12.1.0"
  },

然后再使用cnpm i --save electron@6.1.7完成安裝∨鹋椋現(xiàn)在再執(zhí)行tsc命令,終于可以編譯TS文件了欣硼。

  • 當(dāng)我嘗試把官方文檔 第一個擴展中的console.log代碼移植到build插件中题翰,發(fā)現(xiàn)無法成功。最后把dist目錄中build.js改了一個名字就可以了诈胜,可見build.js是專門用來構(gòu)建使用的……
四豹障、在cocos-build-template插件中使用鉤子
1.測試一下各個鉤子

把Hook.ts中各個函數(shù)都加個console,然后在構(gòu)建時焦匈,打開console控制臺觀察一下:


image.png

比如:

function onBeforeBuild(options) {
    return __awaiter(this, void 0, void 0, function* () {
        // Todo some thing
        console.log("xxxxxxxxxxxxxxxonBeforeBuild");
        log(`${PACKAGE_NAME}.webTestOption`, 'onBeforeBuild');
    });
}

image.png

注意血公,這里如果看不到,刷新擴展管理器是沒用的缓熟,可以重啟一下項目代碼試試累魔。

2.一分鐘學(xué)會 定制項目構(gòu)建流程
var path = require('path');
var fs = require('fs');

function onBeforeBuildFinish (options, callback) {
    Editor.log('Building ' + options.platform + ' to ' + options.dest); // 你可以在控制臺輸出點什么

    var mainJsPath = path.join(options.dest, 'main.js');  // 獲取發(fā)布目錄下的 main.js 所在路徑
    var script = fs.readFileSync(mainJsPath, 'utf8');     // 讀取構(gòu)建好的 main.js
    script += '\n' + 'window.myID = "01234567";';         // 添加一點腳本到
    fs.writeFileSync(mainJsPath, script);                 // 保存 main.js

    callback();
}

這里因為require的原因岩饼,我們就沒辦法在hooks.ts里引入path,fs了。這里參考 creator3.0薛夜, 引入js文件 require 不存在,怎么解決creator 3.0 如何使用js啊版述,仍然未得到解決梯澜。

所以只能在dist文件夾中直接改hooks.js文件。

var path = require('path');
var fs = require('fs');
function onAfterBuild(options, result) {
    if(options.platform == "oppo-mini-game"){
        console.log("xxxxxxxxxxxxxxxonAfterBuild i am oppo");
    }
    console.log("xxxxxxxxxxxxxxxonAfterBuild result", result.dest);
        
    var mainJsPath = path.join(result.dest, '\main.js');// 獲取發(fā)布目錄下的 main.js 所在路徑
    console.log("xxxxxxxxxxxxxxxmainJsPath", mainJsPath);
    var script = fs.readFileSync(mainJsPath, 'utf8');     // 讀取構(gòu)建好的 main.js
    console.log("xxxxxxxxxxxxxxxscript", script);
    script += '\n' + 'window.myID = "01234567";';         // 添加一點腳本到
    fs.writeFileSync(mainJsPath, script);                 // 保存 main.js

經(jīng)過測試渴析,上述代碼在3.01和3.1.0版本中可行晚伙,但是在3.0.0版本中不行,控制臺如下:


  [Build] Cannot find module 'D:\CocosProject\Hello1\extensions\cocos-build-template\dist\web-hooks'
  [Build] Cannot find module 'D:\CocosProject\Hello1\extensions\cocos-build-template\dist\web-hooks'
  [Build] Cannot find module 'D:\CocosProject\Hello1\extensions\cocos-build-template\dist\web-hooks'
  [Build] Cannot find module 'D:\CocosProject\Hello1\extensions\cocos-build-template\dist\web-hooks'
  [Build] Browserslist: caniuse-lite is outdated. Please run:
  [Build] Browserslist: caniuse-lite is outdated. Please run the following command: `npx browserslist --update-db`
  [Build] Cannot find module 'D:\CocosProject\Hello1\extensions\cocos-build-template\dist\web-hooks'
  [Build] Cannot find module 'D:\CocosProject\Hello1\extensions\cocos-build-template\dist\web-hooks'
  [Build] Cannot find module 'D:\CocosProject\Hello1\extensions\cocos-build-template\dist\web-hooks'
  [Build] Cannot find module 'D:\CocosProject\Hello1\extensions\cocos-build-template\dist\web-hooks'
  [Build] 構(gòu)建插件 cocos-build-template 的鉤子函數(shù) onBeforemake 執(zhí)行失敗俭茧,請檢查插件的代碼邏輯~
  [Build] Cannot find module 'D:\CocosProject\Hello1\extensions\cocos-build-template\dist\web-hooks'
  [Build] 構(gòu)建插件 cocos-build-template 的鉤子函數(shù) make 執(zhí)行失敗咆疗,請檢查插件的代碼邏輯~
  [Build] Cannot find module 'D:\CocosProject\Hello1\extensions\cocos-build-template\dist\web-hooks'
  [Build] 構(gòu)建插件 cocos-build-template 的鉤子函數(shù) onAftermake 執(zhí)行失敗,請檢查插件的代碼邏輯~
  [Build] Cannot find module 'D:\CocosProject\Hello1\extensions\cocos-build-template\dist\web-hooks'

加了這個仍然不行

function onBeforeMake(root, options){
}
exports.onBeforeMake = onBeforeMake;

function onAfterMake(root, options){
}
exports.onAfterMake = onAfterMake;

function make(root, options){
}
exports.make = make;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末母债,一起剝皮案震驚了整個濱河市午磁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌毡们,老刑警劉巖迅皇,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異衙熔,居然都是意外死亡登颓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門红氯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來框咙,“玉大人,你說我怎么就攤上這事痢甘±觯” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵塞栅,是天一觀的道長婉称。 經(jīng)常有香客問我,道長构蹬,這世上最難降的妖魔是什么王暗? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮庄敛,結(jié)果婚禮上俗壹,老公的妹妹穿的比我還像新娘。我一直安慰自己藻烤,他們只是感情好绷雏,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布头滔。 她就那樣靜靜地躺著,像睡著了一般涎显。 火紅的嫁衣襯著肌膚如雪坤检。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天期吓,我揣著相機與錄音早歇,去河邊找鬼。 笑死讨勤,一個胖子當(dāng)著我的面吹牛箭跳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播潭千,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼谱姓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了刨晴?” 一聲冷哼從身側(cè)響起屉来,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎狈癞,沒想到半個月后奶躯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡嘹黔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年莫瞬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疼邀。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡喂江,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出获询,到底是詐尸還是另有隱情,我是刑警寧澤吉嚣,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站蹬铺,受9級特大地震影響尝哆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜甜攀,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一琐馆、第九天 我趴在偏房一處隱蔽的房頂上張望恒序。 院中可真熱鬧,春花似錦歧胁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至袄秩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間郭卫,已是汗流浹背背稼。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蟹肘,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓贰盗,卻偏偏與公主長得像阳欲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子球化,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

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