记录Taro1.3.6 微信小程序 => 抖音(字节)小程序

描述

由Taro、React、Ts开发的一个微信小程序,现在想变成字节小程序,记录一下迁移过程。

环境

"node": "11.13.0"
"@tarojs/taro": "1.3.6" //有点旧。。。haha

准备工作

https://microapp.bytedance.com 字节开发者中心 注册开发账户,创建一个项目,并认证主体(目前只能企业认证)。
去开发设置里配置服务器域名(直接去小程序后台配置复制过来)。
下载开发者工具。

配置内容

增加project.tt.json,把appID改上去。

编译

把编译命令的:weapp改成:tt
开发工具导入项目的时候,直接导入dist目录,因为IDE会去找project.config.json里面的appid。

问题整理

1、编译结果出错

有两个页面的import Base from '@/components/Base'被编译成了<import src="@/components/Base.wxml" />导致IDE识别出错,跑不起来。其实在:weapp编译出来也是这样的,但微信小程序的IDE就能正常跑。在:tt编译出来的文件里手动删除<import src="@/components/Base.wxml" />之后,项目可以正常跑起来。
这两个页面有个共同点,都用到了无状态函数组件,如下:

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

测试发现确实是这个问题导致的。以下是尝试修复过程记录:

(1)、尝试升级taro版本到2.2.13(并不能解决上面问题)
只升级当前项目,先把node版本切换到12.10.0,然后执行yarn add -D @tarojs/cli@2.2.13+yarn taro update project 2.2.13+yarn add -D @tarojs/mini-runner@2.2.13
然后调整config/index配置文件(参考Taro文档)。
再执行yarn remove @tarojs/async-await。同时App.tsx文件里删除import '@tarojs/async-await';
再执行yarn add -D babel-plugin-transform-runtime+yarn add -D babel-plugin-transform-runtime,同时修改项目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'
],

编译后还有如下一些问题,可自行解决:
①、is_js插件有冲突。
②、所有模块化引入的scss全部没有编译进去,样式全部失效。

(2)、研究编译源码,找编译出错的原因(能解决)
我尝试直接删除dist/文件里的<import src="@/components/Base.wxml" />,删除后项目是可以跑起来的。所以理论上只要编译不出现这段代码,就没问题。因为同一套代码,:weapp编译是没有问题的,:tt编译就出这个问题,所以重点去看:tt的编译逻辑。
首先,找到node_modules/@tarojs/cli/src/build.ts,这里面有一个build方法,是taro打包编译的入口。然后顺藤摸瓜,可以依次找到./mini/index > build() > ./mini/page > buildPages() > ./mini/page > buildSinglePage() > ./mini/native > processNativeWxml()。其中有一个关键字段REG_WXML_IMPORT,看他的声明是export const REG_WXML_IMPORT: RegExp = /<import(.*)?src=(?:(?:'([^']*)')|(?:"([^"]*)"))/gi,看着很眼熟。于是我加了个log测试下,果然有收获。

while ((regResult = constants_1.REG_WXML_IMPORT.exec(wxmlContent)) != null) {
    util_1.printLog("reference", '测试', `${regResult[2]}+${regResult[3]}`);  //加的log代码
    importWxmlPathList.push(regResult[2] || regResult[3]);
}
//下面是编译log出来的内容
生成  页面逻辑  dist/pages/resume/publish/index.js*
引用  测试      undefined+@/components/Base.wxml     << 就是他
生成  页面模板  dist/pages/resume/publish/index.ttml

再测试发现前面componentWXMLContent解析出来就已经包含了<import src="@/components/Base.wxml" />这段内容。
./mini/page里有一段:

const transformResult = wxTransformer({
    code: pageJsContent,    //整个页面的内容字符串
    sourcePath: pageJs,      //原始页面路径,如:~/User/git/demo/src/pages/index/index.tsx
    sourceDir,     //根目录,如:~/User/git/demo/src
    outputPath: outputPageJSPath,     //输出页面路径,如:~/User/git/demo/dist/pages/index/index.tsx
    isRoot: true,
    isTyped: constants_1.REG_TYPESCRIPT.test(pageJs),
    adapter: buildAdapter,           //平台名,如:weapp,tt
    env: constantsReplaceList,    //环境变量,如:{ ‘process.env.NODE_ENV’: ‘development’, ENV: undefined, ‘process.env.TARO_ENV’: ‘tt’ }
    rootProps,
    jsxAttributeNameReplace   //属性名替换的配置,如:{ cssClass: ‘css-class’, cssPlaceholderClass: ‘css-placeholder-class’ }
});

这里面传入的数据都没问题,但返回的transformResult就不对了。
然后找到@tarojs/transformer-wx/lib/src/index > transform(),测试发现里面有一段result = new class_1.Transformer(mainClass, options.sourcePath, componentProperies, options.sourceDir).result;处理之后就生成了错误结果。
然后重点来了,找到@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);
        }
    }
},

没搞懂这段代码的目的是什么,我先给它注释掉再说,简单粗暴!

2、自定义头部不支持

字节小程序自定义头部功能需要申请开通才能用。在功能管理 > 页面结构自定义中申请。

3、开发工具默认第一个页面不是"pages/index/index"

开发工具编译后进入的首页不是"pages/index/index",而是进入了"pages/mine/index"。
但是上传代码后用真机进入体验版,首页进入正常。

未完待续。。。

参考资料

Taro 1.x 迁移至 2.x文档:https://taro-docs.jd.com/taro/docs/2.x/migrate-to-2
Taro cli流程及编译代码解析:https://segmentfault.com/a/1190000041515931
字节小程序开发文档:https://microapp.bytedance.com/docs/zh-CN/mini-app/develop/functional-plug-in/custom/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容