Tarojs小程序开发:从2.x升级到3

原文

https://yxdt.github.io/fullstack/2020/07/12/Taro-2.x-upgrade-to-3.html

Tarojs

Tarojs 是京东凹凸实验室开发的统一小程序开发框架,实现了一次编码,实现微信、支付宝、百度、字节、H5、RN 等各端小程序。

发布两年多来,热度持续提升,20 年 7 月推出了 3.0 版本,是对该框架的一次重要升级。按照 IT 界传统惯例,软件只有推出到 3.0 版本才算是真正成熟,Tarojs 也不例外。

粗略看了一下跟 2.x 版本的区别,可以明显感觉出 3.0 版本不再是“寄生”在 Reactjs 上的补丁型框架了,从底层上实现了真正的跨越框架的目标,开发人员可以无缝切换到 React、Nerv、Vue、jQuery 等 JS 框架,为用户提供了最大的自由度。

我也算是 Tarojs 的深度用户了,由于小程序开发本身语法相对特殊,为开发人员设定了很多限制,而习惯了 React 的开发模式,发现了 Taro 这个能够基于 Reactjs 并能开发出跨平台的框架,自然是全面拥抱,从小程序开发的第一天就用 Tarojs 框架。现在手边的工作也因为 Tarojs 升级到了 3.0 而再了解 3.0 的原理和机制的基础上,对已有 2.0 版本的开发项目进行升级。

具体 Taro3 的新功能可以参考官方升级指引  [官方博文](https://aotu.io/notes/2020/06/30/taro-3-0-0/)

2.x到3的迁移

官方迁移指南

主要参考资料是官方给出的[迁移指南](!https://taro-docs.jd.com/taro/docs/migration)

1.检查本机当前taro版本

> taro --version

如果没有安装,或者现有版本还没有到 3.0.0 以上,可以用下面的命令进行升级。

2.对本机安装的运行时Taro/cli升级

官方给出的命令是:

> npm i -g @tarojs/cli@next

但该命令由于有@next 的存在,只升级到 3.0.0-rc.6

所以现在可以直接输入:

>npm i -g @tarojs/cli

升级到最新版本,目前是 3.0.2

3. 项目安装包升级

然后进入要升级的项目目录,进行安装包升级:

@tarojs/runtime

@tarojs/mini-runner

@tarojs/components

@tarojs/taro

@tarojs/react --如果用的是 React

taro-ui@next --如果用到了 taro-ui

react

react-dom -- taro-ui 会用到

> npm i <以上的包>

为了能安装到最新版,偷了个懒,先到 package.json 把对应的 dependencies 中所有@tarojs 开头的先删掉。其中需要说明的是 taro ui 也需要升级,否则会报错。

升级后,如果还不放心,可以输入:

> npm-check -u

对所有安装包进行一次升级,升级到最新版本。

4. 创建新的项目对照

在 taro/cli 升级到 3 之后,也可以通过输入

>taro init newApp

创建一个新的空项目,然后打开 package.json 参考对比安装包的版本号

>npm i -D @tarojs/webpack-runner

5. 源代码迁移

由于 Taro3 最大的变化是独立于 Reactjs,因此需要在对应的代码中,添加、修改相应的 import,确保 React 及其子组件能够被正确的引入。

基本就是,涉及到

> import {Component, useState} from '@tarojs/taro'

修改为

> import {Component, useState} from 'react'

前提条件是需要安装最新的 react 包。

6. Typescript 支持

如果是用 TS 开发的,则需要在 tsconfig.json 文件中,修改对应的配置:

> "jsx" :"preserve",

> "jsxFactory":"Taro.createElement",

修改为:

> "jsx":"react",

> "jsxFactory":"React.createElement",

7. Jest 异常修正

升级到 Taro3 后,Jest 的测试意外停止工作,爆出的错误如下:

```

 path\of\app\node_modules\@tarojs\runtime\dist\runtime.esm.js:1

    import { isBooleanLiteral } from 'babel-types';

    ^^^^^^

    SyntaxError: Cannot use import statement outside a module

      1 | import Taro from "@tarojs/taro";

        | ^

      2 | //import { WxUserInfo, RegUser } from "src/types/ars";

      3 | import { userLogin } from "./rest";

      4 | import QQMapWX from "../libs/qqmap-wx-jssdk";

      at Runtime._execModule (node_modules/jest-runtime/build/index.js:1179:56)

      at Object. (node_modules/@tarojs/taro/node_modules/@tarojs/api/dist/index.js:5:15)

      at Object. (node_modules/@tarojs/taro/index.js:1:14)

      at Object. (src/controllers/users.ts:1:1)

      at Object. (test/simple.test.js:1:36)

```

翻了 Stackoverflow, 找到原因是:“有些库使用了未经编译的 ES6 代码”造成的,而 Jest 需要这些代码经过编译才能运行”。StackOverflow原文链接

 [Jest ES6 代码造成 import 语句错误问题](!https://stackoverflow.com/questions/55794280/jest-fails-with-unexpected-token-on-import-statement)

具体的修正方法就是在项目的“jest.config.js”文件中,修改 transformIgnorePatterns 选项,

将造成错误的@tarojs 库排除:

```javascript

transformIgnorePatterns: [

    "/node_modules/(?!(taro-ui|@tarojs)/)",

  ],

```

备注: 关于 Taro 开发微信 APP 的测试开发也是一路填坑,我将专门再写一篇文章。

补充说明

如果开发过程中使用了 taro ui ,那么还是先暂时不要升级到 Taro 3, 因为 taro-ui 目前的正式版本还不能支持 Taro3,taro-ui 的 3.0 版本处于 alpha 阶段,有部分控件不能正确工作,所以还不能真正用到实际项目开发中。

你可能感兴趣的:(Tarojs小程序开发:从2.x升级到3)