記錄Taro1.3.6 微信小程序 => 抖音(字節(jié))小程序

描述

由Taro坑夯、React喂窟、Ts開(kāi)發(fā)的一個(gè)微信小程序庐椒,現(xiàn)在想變成字節(jié)小程序椒舵,記錄一下遷移過(guò)程。

環(huán)境

"node": "11.13.0"
"@tarojs/taro": "1.3.6" //有點(diǎn)舊约谈。笔宿。。haha

準(zhǔn)備工作

https://microapp.bytedance.com 字節(jié)開(kāi)發(fā)者中心 注冊(cè)開(kāi)發(fā)賬戶棱诱,創(chuàng)建一個(gè)項(xiàng)目泼橘,并認(rèn)證主體(目前只能企業(yè)認(rèn)證)。
去開(kāi)發(fā)設(shè)置里配置服務(wù)器域名(直接去小程序后臺(tái)配置復(fù)制過(guò)來(lái))迈勋。
下載開(kāi)發(fā)者工具炬灭。

配置內(nèi)容

增加project.tt.json,把a(bǔ)ppID改上去靡菇。

編譯

把編譯命令的:weapp改成:tt重归。
開(kāi)發(fā)工具導(dǎo)入項(xiàng)目的時(shí)候,直接導(dǎo)入dist目錄厦凤,因?yàn)镮DE會(huì)去找project.config.json里面的appid鼻吮。

問(wèn)題整理

1、編譯結(jié)果出錯(cuò)

有兩個(gè)頁(yè)面的import Base from '@/components/Base'被編譯成了<import src="@/components/Base.wxml" />導(dǎo)致IDE識(shí)別出錯(cuò)较鼓,跑不起來(lái)椎木。其實(shí)在:weapp編譯出來(lái)也是這樣的,但微信小程序的IDE就能正常跑博烂。在:tt編譯出來(lái)的文件里手動(dòng)刪除<import src="@/components/Base.wxml" />之后香椎,項(xiàng)目可以正常跑起來(lái)。
這兩個(gè)頁(yè)面有個(gè)共同點(diǎn)禽篱,都用到了無(wú)狀態(tài)函數(shù)組件畜伐,如下:

public render() {
  return (
    <View>
      {this.renderVipDom()}
    </View>
  )
}
private renderVipDom = () => {
  return <View>...</View>
}

測(cè)試發(fā)現(xiàn)確實(shí)是這個(gè)問(wèn)題導(dǎo)致的。以下是嘗試修復(fù)過(guò)程記錄:

(1)谆级、嘗試升級(jí)taro版本到2.2.13(并不能解決上面問(wèn)題)
只升級(jí)當(dāng)前項(xiàng)目烤礁,先把node版本切換到12.10.0,然后執(zhí)行yarn add -D @tarojs/cli@2.2.13+yarn taro update project 2.2.13+yarn add -D @tarojs/mini-runner@2.2.13肥照。
然后調(diào)整config/index配置文件(參考Taro文檔)脚仔。
再執(zhí)行yarn remove @tarojs/async-await。同時(shí)App.tsx文件里刪除import '@tarojs/async-await';舆绎。
再執(zhí)行yarn add -D babel-plugin-transform-runtime+yarn add -D babel-plugin-transform-runtime鲤脏,同時(shí)修改項(xiàng)目babel 配置如下:

babel: {
  sourceMap: true,
  presets: [['env', { modules: false }]],
  plugins: [
    'transform-decorators-legacy',
    'transform-class-properties',
    'transform-object-rest-spread',
    ['transform-runtime', {
      "helpers": false,
      "polyfill": false,
      "regenerator": true,
      "moduleName": 'babel-runtime'
    }]
  ]
}

由于使用了sass,還需要yarn add -D @tarojs/plugin-sass,并在config里配置:

plugins: [
    '@tarojs/plugin-sass',
    '@tarojs/plugin-less'
],

編譯后還有如下一些問(wèn)題猎醇,可自行解決:
①窥突、is_js插件有沖突。
②硫嘶、所有模塊化引入的scss全部沒(méi)有編譯進(jìn)去阻问,樣式全部失效。

(2)沦疾、研究編譯源碼称近,找編譯出錯(cuò)的原因(能解決)
我嘗試直接刪除dist/文件里的<import src="@/components/Base.wxml" />,刪除后項(xiàng)目是可以跑起來(lái)的哮塞。所以理論上只要編譯不出現(xiàn)這段代碼刨秆,就沒(méi)問(wèn)題。因?yàn)橥惶状a忆畅,:weapp編譯是沒(méi)有問(wèn)題的衡未,:tt編譯就出這個(gè)問(wèn)題,所以重點(diǎn)去看:tt的編譯邏輯家凯。
首先缓醋,找到node_modules/@tarojs/cli/src/build.ts,這里面有一個(gè)build方法肆饶,是taro打包編譯的入口改衩。然后順藤摸瓜岖常,可以依次找到./mini/index > build() > ./mini/page > buildPages() > ./mini/page > buildSinglePage() > ./mini/native > processNativeWxml()驯镊。其中有一個(gè)關(guān)鍵字段REG_WXML_IMPORT,看他的聲明是export const REG_WXML_IMPORT: RegExp = /<import(.*)?src=(?:(?:'([^']*)')|(?:"([^"]*)"))/gi竭鞍,看著很眼熟板惑。于是我加了個(gè)log測(cè)試下,果然有收獲偎快。

while ((regResult = constants_1.REG_WXML_IMPORT.exec(wxmlContent)) != null) {
    util_1.printLog("reference", '測(cè)試', `${regResult[2]}+${regResult[3]}`);  //加的log代碼
    importWxmlPathList.push(regResult[2] || regResult[3]);
}
//下面是編譯log出來(lái)的內(nèi)容
生成  頁(yè)面邏輯  dist/pages/resume/publish/index.js*
引用  測(cè)試      undefined+@/components/Base.wxml     << 就是他
生成  頁(yè)面模板  dist/pages/resume/publish/index.ttml

再測(cè)試發(fā)現(xiàn)前面componentWXMLContent解析出來(lái)就已經(jīng)包含了<import src="@/components/Base.wxml" />這段內(nèi)容冯乘。
./mini/page里有一段:

const transformResult = wxTransformer({
    code: pageJsContent,    //整個(gè)頁(yè)面的內(nèi)容字符串
    sourcePath: pageJs,      //原始頁(yè)面路徑,如:~/User/git/demo/src/pages/index/index.tsx
    sourceDir,     //根目錄葱弟,如:~/User/git/demo/src
    outputPath: outputPageJSPath,     //輸出頁(yè)面路徑盐碱,如:~/User/git/demo/dist/pages/index/index.tsx
    isRoot: true,
    isTyped: constants_1.REG_TYPESCRIPT.test(pageJs),
    adapter: buildAdapter,           //平臺(tái)名蹦掐,如:weapp,tt
    env: constantsReplaceList,    //環(huán)境變量,如:{ ‘process.env.NODE_ENV’: ‘development’, ENV: undefined, ‘process.env.TARO_ENV’: ‘tt’ }
    rootProps,
    jsxAttributeNameReplace   //屬性名替換的配置喷好,如:{ cssClass: ‘css-class’, cssPlaceholderClass: ‘css-placeholder-class’ }
});

這里面?zhèn)魅氲臄?shù)據(jù)都沒(méi)問(wèn)題,但返回的transformResult就不對(duì)了读跷。
然后找到@tarojs/transformer-wx/lib/src/index > transform()梗搅,測(cè)試發(fā)現(xiàn)里面有一段result = new class_1.Transformer(mainClass, options.sourcePath, componentProperies, options.sourceDir).result;處理之后就生成了錯(cuò)誤結(jié)果。
然后重點(diǎn)來(lái)了,找到@tarojs/transformer-wx/lib/src/class > CallExpression()里面有一段:

enter(callPath) {
    const callee = callPath.get('callee');
    const args = callPath.node.arguments;
    if (callee.isMemberExpression()) {
        const { object, property } = callee.node;
        if (t.isThisExpression(object) && t.isIdentifier(property) && property.name.startsWith('render')) {
            const propName = property.name;
            if (!self.methods.has(propName)) {
                const o = utils_1.getSuperClassPath(self.classPath);
                if (o) {
                    const p = o.resolvePath.endsWith('.js') ? o.resolvePath.slice(0, o.resolvePath.length - 3) : o.resolvePath;
                    self.importJSXs.add(`<import src="${p + '.wxml'}"/>`);    //這是不是很眼熟
                }
            }
            self.renameJSXClassFunc(propName, methodName, callPath, args);
        }
    }
    if (callee.isIdentifier()) {
        const nodeName = callee.node.name;
        if (nodeName.startsWith('renderClosure')) {
            self.renameJSXClassFunc(nodeName, methodName, callPath, args, true);
        }
    }
},

沒(méi)搞懂這段代碼的目的是什么无切,我先給它注釋掉再說(shuō)荡短,簡(jiǎn)單粗暴!

2哆键、自定義頭部不支持

字節(jié)小程序自定義頭部功能需要申請(qǐng)開(kāi)通才能用掘托。在功能管理 > 頁(yè)面結(jié)構(gòu)自定義中申請(qǐng)。

3籍嘹、開(kāi)發(fā)工具默認(rèn)第一個(gè)頁(yè)面不是"pages/index/index"

開(kāi)發(fā)工具編譯后進(jìn)入的首頁(yè)不是"pages/index/index"烫映,而是進(jìn)入了"pages/mine/index"。
但是上傳代碼后用真機(jī)進(jìn)入體驗(yàn)版噩峦,首頁(yè)進(jìn)入正常锭沟。

未完待續(xù)。识补。族淮。

參考資料

Taro 1.x 遷移至 2.x文檔:https://taro-docs.jd.com/taro/docs/2.x/migrate-to-2
Taro cli流程及編譯代碼解析:https://segmentfault.com/a/1190000041515931
字節(jié)小程序開(kāi)發(fā)文檔:https://microapp.bytedance.com/docs/zh-CN/mini-app/develop/functional-plug-in/custom/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市凭涂,隨后出現(xiàn)的幾起案子祝辣,更是在濱河造成了極大的恐慌,老刑警劉巖切油,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝙斜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡澎胡,警方通過(guò)查閱死者的電腦和手機(jī)孕荠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)攻谁,“玉大人稚伍,你說(shuō)我怎么就攤上這事∑莼拢” “怎么了个曙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)受楼。 經(jīng)常有香客問(wèn)我垦搬,道長(zhǎng),這世上最難降的妖魔是什么艳汽? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任猴贰,我火速辦了婚禮,結(jié)果婚禮上骚灸,老公的妹妹穿的比我還像新娘糟趾。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布义郑。 她就那樣靜靜地躺著蝶柿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪非驮。 梳的紋絲不亂的頭發(fā)上交汤,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音劫笙,去河邊找鬼芙扎。 笑死,一個(gè)胖子當(dāng)著我的面吹牛填大,可吹牛的內(nèi)容都是我干的戒洼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼允华,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼圈浇!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起靴寂,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤磷蜀,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后百炬,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體褐隆,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年剖踊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了庶弃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蜜宪,死狀恐怖虫埂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情圃验,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布缝呕,位于F島的核電站澳窑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏供常。R本人自食惡果不足惜摊聋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望栈暇。 院中可真熱鬧麻裁,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至手销,卻和暖如春歇僧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锋拖。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工诈悍, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人兽埃。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓侥钳,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親柄错。 傳聞我的和親對(duì)象是個(gè)殘疾皇子慕趴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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