首页 > 其他分享 >Taro 项目总结

Taro 项目总结

时间:2024-02-26 15:02:38浏览次数:27  
标签:总结 const 项目 url requestConfig import Taro data

对公司以 Taro 框架开发的项目进行部分总结。

快速上手

快速搭建 Taro 项目

# 全局安装 taro cli
npm install -g @tarojs/cli
# 使用 taro 命令初始化项目
taro init [项目名称]

# 或者直接使用 npx 安装
npx @tarojs/cli init [项目名称]

启动项目,查看 package.json 文件,其中 dev 相关的命令是开发过程中执行的,build 相关的命令是打包上传使用的。

npm run dev:weapp # 小程序开发执行命令
npm run build:weapp # 小程序打包上传执行命令

npm run dev:h5 # h5 开发执行命令
npm run build:h5 # h5 打包执行命令

更多初始化细节参考 taro官网

使用路径别名

// config/index.ts
import path from 'path'

const baseConfig: UserConfigExport = {
 // ...
 alias: {
     '@': path.resolve(process.cwd(), 'src'),
   },
}

区分生产和开发环境

生产和开发时调用的地址通常是不一样的,打包时直接自动替换,而非手动修改,也可尝试使用 .env 文件来做区分

// config/base_api.ts
const ENV_API = {
  development: 'http://10.xxx:8888/Api',
  production: 'https://101.xxx:8888/Api',
}

const BASE_API = ENV_API[process.env.NODE_ENV]

export default BASE_API

Taro 项目版本更新

更新 Taro 项目所在的依赖

# 使用 npm 安装 CLI
$ npm install -g @tarojs/cli
# OR 使用 yarn 安装 CLI
$ yarn global add @tarojs/cli


# 使用Taro 升级命令更新CLI版本到最新版本
$ taro update self

# 使用Taro 升级命令更新CLI版本到指定版本
$ taro update self [版本号]

# 使用Taro 升级命令将项目依赖升级到与@tarojs/cli一致的版本
$ taro update project

# 使用Taro 升级命令将项目依赖升级到指定版本
$ taro update project [版本号]

h5 跨域和区分生产环境进行项目打包

运行和打包时,所有的资源都会被打包到 dist 文件夹下,这使得每次只能打包一个环境的文件。

config/index.ts

export default defineConfig(async (merge) => {
  const baseConfig: UserConfigExport = {
    sourceRoot: 'src',
    // 不同环境运行和打包到不同文件夹下
    outputRoot: `dist/${process.env.TARO_ENV}`,
    alias: {  // 路径别名
      '@': path.resolve(process.cwd(), 'src'),
    },
    h5: {
      // h5 端的跨域代理
      devServer: {
        proxy: {
          '/api': {
            target: 'https://xxx.com/sw/Uapi',
            changeOrigin: true,
            pathRewrite: {
              '/api': '/',
            },
          },
        },
      },
    },
});

打包上传时,一定要执行 build 命令。dev 下的 --watch 会增加大量运行时的 runtime 文件,不能作为上线的最终产物。

分运行环境打包时,针对小程序端,还要做额外处理

project.config.json

{
  // root 路径需要更改
  "miniprogramRoot": "./dist/weapp",
  "appid": "",
  "setting": {
    "urlCheck": true,
    "es6": false,
    "enhance": false,
    "compileHotReLoad": false,
    "postcss": false,
    "minified": false
  },
  "compileType": "miniprogram"
}

社区产物

路由

不管是 uniapp 或者 taro 开发,都离不开路由传参。少量参数可以通过 url 地址拼接,但是大量的复杂数据,想要通过 url 传参是不现实的,因为 url 传参的大小是有限制的,可能会造成数据截断。

分析官方提供的常用路由传参方式。

url 拼接传参(Taro版)

传参

Taro.navigateTo({
  url: '/pages/page/path/name?id=2&type=test',
});

const list = [
  { name: '张三', age: 10 },
  { name: '李四', age: 20 },
];

Taro.navigateTo({
  url: `/pages/page/path?list=${JSON.stringify(list)}`,
});

接收参数

useLoad((options) => {
  console.log(options);
  // console.log(JSON.parse(options));
});

eventChannel

适合大量参数传递,仅支持微信小程序。微信小程序文档

// 向 pages.test 页面传递数据 list
Taro.navigateTo({
  url: '/pages/test',
  success: function (res) {
    // 通过eventChannel向被打开页面传送数据
    res.eventChannel.emit('acceptDataFromOpenerPage', { data: list });
  },
});

参数接收

useLoad((option) => {
  const pages = Taro.getCurrentPages();
  const current = pages[pages.length - 1]; /* 从堆栈中获取当前界面的属性 */
  const eventChannel = current.getOpenerEventChannel();
  eventChannel.on('acceptDataFromOpenerPage', (options) => {
    console.log(options);
  });
});

tarojs-router-next

  • 自动生成带参数类型提示的路由方法
  • 允许传递任意类型、任意大小的参数数据
  • 同步的路由方法调用
  • koa 体验一致的路由中间件

官网

组件库

目前使用下来,@antmjs/vantui 是体验最好的 Taro 组件库,具有较为丰富的功能组件,支持 h5 和微信小程序。

gitee 文档

按需引入组件

  • 安装 babel-plugin-import
npm i babel-plugin-import -D
  • .babelrcbabel.config.js 中添加配置
module.exports = {
  // ...
  plugins: [
    [
      'import',
      {
        libraryName: '@antmjs/vantui',
        libraryDirectory: 'es',
        style: (name) => `${name}/style/less`,
      },
      '@antmjs/vantui',
    ],
  ],
}

修改主题

此处可参考官方文档 定制主题

  • 新建一个 less 文件,引入 vantui 的 less 变量,并对 less 主题色进行更改
  • 将该 less 文件引入 app.ts 文件中
@import '@antmjs/vantui/es/style/var.less';

:root,
page {
  /* 全局修改默认主题色 */
  --primary-color: #1989fa;
}
  • 通过覆盖 less 主题方式修改。其中 src/styles/index.less 为修改 less 变量的文件,需要告诉 vantui,修改的主题在该文件下
export default defineConfig(async (merge) => {
  const baseConfig: UserConfigExport = {
      mini: {
      lessLoaderOption: {
        lessOptions: {
          modifyVars: {
            hack: `true; @import "${path.join(process.cwd(), 'src/styles/index.less')}";`,
          },
        },
      },
    },
})

网络请求封装(TS 版本)

import Taro from '@tarojs/taro'
import checkStatus from './status'
import type { IRequestConfig } from './typings'
import { PLATFORM_WX, TOKEN_KEY } from '@/constants'
import BASE_API from 'config/base_api'

const H5 = process.env.TARO_ENV === 'h5' // 是否是 小程序环境

// 枚举后台异常状态码
enum ErrorCode {
  UN_AUTH = 401, // 未授权或者 token 失效,需登录
  UNKNOWN = 500, // 服务异常
}

class HttpRequest {
  // 处理WX请求异常状态码。请求成功,但官方返回异常状态
  private handlerWXErrorStatus(errMsg: string, { toast = true }: IRequestConfig) {
    toast && Taro.showToast({ title: `${errMsg},错误码:${statusCode}`, icon: 'none' })
  }

  // 处理WX请求异常。请求出错
  private handlerWXError(err: TaroGeneral.CallbackResult, { toast = true }: IRequestConfig) {
    let errMsg = ''
    if (/timeout/.test(err.errMsg)) {
      errMsg = '请求超时'
    }
    toast && Taro.showToast({ title: errMsg || err.errMsg, icon: 'none' })
  }

  // 处理后台异常状态码
  private responseInterceptorsHandler(code: number, msg = '') {
    switch (code) {
      case ErrorCode.UN_AUTH:
        this.handleNoAuth()
        break
      default:
        Taro.showToast({ title: msg || '请求失败', icon: 'none' })
        break
    }
  }

  // 处理登陆过期的问题
  private handleNoAuth = () => {
    Taro.clearStorageSync()
    Taro.showModal({
      title: '登陆提示',
      content: '未绑定账号或登录过期,请重新登录',
      showCancel: false,
      success(res) {
        if (res.confirm) Taro.reLaunch({ url: '/pages/my/index' })
      },
    })
  }

  // 服务器接口请求
  private request<T>(requestConfig: IRequestConfig): Promise<R<T>> {
    return new Promise((resolve, reject) => {
      // 默认header
      const contentType =
        requestConfig.method === 'GET' ? 'application/x-www-form-urlencoded' : 'application/json'
      const header = {
        'content-type': contentType,
        ...requestConfig.header,
        Authentication: Taro.getStorageSync(TOKEN_KEY),  // 请求 token
      }
      // 是否显示loading,显示mask用于阻止用户多次点击
      if (requestConfig.loading) {
        Taro.showLoading && Taro.showLoading({ title: '加载中...', mask: true })
      }

      Taro.request({
        method: requestConfig.method,
		// h5 端需要代理跨域
        url: H5 ? `/api${requestConfig.url}` : `${BASE_API}${requestConfig.url}`,
        data: requestConfig.data,
        header,
        dataType: !requestConfig.dataType ? 'json' : '其他',
        success: (res) => {
          // 加载完成关闭提示框
          if (requestConfig.loading) {
            Taro.hideLoading && Taro.hideLoading()
          }
          //res:{cookies, data, header, statusCode}
          const statusCode = res.statusCode
          const data = res.data as R<T>

          // 先校验返回的状态码,非200状态码处理
          if (statusCode !== 200) this.handlerWXErrorStatus(res.errMsg, requestConfig)

          // 返回状态码无误,再校验 后台状态码
          if (data.code !== 200) this.responseInterceptorsHandler(data.code, data.msg)
          resolve(data)
        },
        fail: (err) => {
          this.handlerWXError(err, requestConfig)
          reject(err)
        },
      })
    })
  }

  // 仿 axios 请求方式
  public get<T>(url: string, otherConfig: IRequestConfig = {}) {
    return this.request<T>({ method: 'GET', url, ...otherConfig })
  }

  public post<T>(url: string, otherConfig: IRequestConfig = {}) {
    return this.request<T>({ method: 'POST', url, ...otherConfig })
  }

  public delete<T>(url: string, otherConfig: IRequestConfig = {}) {
    return this.request<T>({ method: 'DELETE', url, ...otherConfig })
  }

  public put<T>(url: string, otherConfig: IRequestConfig = {}) {
    return this.request<T>({ method: 'PUT', url, ...otherConfig })
  }
}

/**
 * @description 封装请求
 * 扩展功能:
 * - 统一错误提示,包括小程序本身和后台异常状态码,默认自动提示
 * - 可选的全局 loading
 * - 细化结果的返回类型
 */
const http = new HttpRequest()
export default http

请求示例

import http from '@/utils/request'

export const fetchList = (params: Pagination) => {
  return http.get<List<MyList[]>>('/test/list', {
    data: params,
    loading: true,
  })
}

TS 类型定义文件

export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE'

export type IRequestConfig = {
  /** API路径 */
  url?: string
  /** Method类型 */
  method?: HttpMethod
  /** 接口传参数据 */
  data?: object
  /** 自定义请求头,合并 header 而非替换 */
  header?: IAnyObject
  /** 返回的数据格式,默认值 json,对后台数据进行一次 JSON.prase */
  dataType?: 'json' | '其他'
  /** 请求报错时,是否弹出 Toast 的 message 提示(默认弹出:true)*/
  toast?: boolean
  /** 请求时,是否加载 loading 框,默认不加载:false*/
  loading?: boolean
}

标签:总结,const,项目,url,requestConfig,import,Taro,data
From: https://www.cnblogs.com/jsonq/p/18034351

相关文章

  • EvoSuite使用总结
    1.安装EvoSuite插件以IDEA为例,在Plugins栏搜索EvoSuite后点击install,安装完成后重启IDEA2.使用EvoSuite选中文件右键选择RunEvoSuite生成成功可以看到如下提示:注意事项:生成路径:src/test/java使用junit4版本然后在pom.xml文件添加如下依赖:<dependency>......
  • cloudreve源码来构建项目的脚手架
    接口中,定义serviceservice返回响应方法;//UserLogin用户登录funcUserLogin(c*gin.Context){varserviceuser.UserLoginServiceiferr:=c.ShouldBindJSON(&service);err==nil{res:=service.Login(c)c.JSON(200,res)......
  • 优化方法总结
    个人学习使用,内容来源于网络,侵权删神经网络反向传播时参数朝着最小化损失的方向前进,确切说,是朝着梯度方向更新。设神经网络参数是\(W\),学习率是\(\alpha\),网络代表的函数是\(L(W)\),那么参数更新公式可表示为:$W=W-\alpha*\bigtriangledown_WL(W)$在深度学习中,有三种最基本的梯......
  • vue项目npm run build的时候自动更新package.json中的version
    在vue项目最外侧新增一个addVersion.js 脚本,脚本中编写逻辑来解析当前的版本号//addVersion.jsconstfs=require('fs');constpath=require('path');constpackageJsonPath=path.join(__dirname,'package.json');try{//读取package.json......
  • MAUI Blazor+MASA开发安卓应用学习笔记 - 新建项目和发布
    PS:开个新坑,内容都是全新接触的东西,包括MAUI,Blazor,MASA等等。整个项目都边学习边做的,有什么错的地方望大神指教。 学习开发安卓应用,我们的最终目标就是要生成一个APP应用,并能成功的在手机端打开。那么,我们首先要解决的就是怎么生成APP应用。一、创建一个.NETMAUIBlazor应用(注......
  • 万字Java进阶笔记总结
    JavaApi字符串String注意:Java中“==”操作符的作用:基本数据类型:比较的是内容。引用数据类型比较的是对象的内存地址。StringBuffer/StringBuilder由于String是字符串是常量,它们的值在创建之后不能更改。如果我们使用这个String频繁进行操作,会有性能问题,这个时候就需要......
  • make集成go语言项目
    参考下面这个makefile.PHONY:builddebugdlvcleantoollinthelpall:buildbuild: @gobuild-v.debug: gobuild-gcflags"all=-N-l"-v-oapp.dlv: dlv--listen=:2345--headless=true--api-version=2--accept-multiclientexec./apptool:......
  • 在MFC MDI项目中创建子窗口并显示
    该项目是基于MFCMDI向导创建的项目,建议创建MDI项目的类向导中,在最后选择生成的类中,view类基于CFormView,要在MDI项目中创建自定义的子窗口并显示在矿建窗口中使用以下步骤:1、使用类向导创建基于MFC的类,基类选择CFormView(这个有类似对话框的功能),当然也可以使用CView。2、创建完成......
  • 浮动、bfc-规范、清除浮动总结
    介绍参考:浮动、bfc-规范、清除浮动的最佳实践#浮动、BFC规范、清除浮动的最佳实践TIP在讲CSS浮动之前,我们要现在了解下CSS布局有哪些实现机制#一、实现CSS布局的几种策略网页布局的本质是:用CSS来摆放盒子,把盒子摆放到页面对应的位置。在之前的章节我们已经详细......
  • umijs 项目配置问题汇总
    umi配置问题汇总umi或@umijs/max集成tailwindcss正常umi内置了tailwindcss插件,详情可参考官方文档TailwindCSS配置生成器但是由于内置的tailwindcss插件过老,umi官方已不推荐使用内置,建议使用tailwindcss官方的配置。详情可见issue同时,umi官方也不推荐使用p......