小程序开发:开启定制化custom-tab-bar但不生效疑问,以及使用NutUI-React Taro的安装和使用

news/2025/10/3 18:31:26/文章来源:https://www.cnblogs.com/tlnshuju/p/19124853

小程序开发:开启定制化custom-tab-bar但不生效疑问,以及使用NutUI-React Taro的安装和使用

2025-10-03 18:28  tlnshuju  阅读(0)  评论(0)    收藏  举报

        在开发微信小程序时,发现使用webpack可以自动识别使用定制的custom-tab-bar,而使用vite则不能走定制的现象。这是在 微信小程序 里,custom-tab-bar 是否能生效,并不是框架层(React / Vue / Taro / …)直接决定的,而是 编译工具链对小程序配置的支持程度 不一样导致的。

一、custom-tab-bar问题

         这是常见的app.config.ts的配置,导航栏样式和tabBar都是走的定制化。

export default defineAppConfig({pages: ['pages/index/index', 'pages/about/index'],subPackages: [{root: 'subpackages/login',pages: ['index']}],window: {navigationStyle: 'custom'// backgroundTextStyle: 'light',// navigationBarBackgroundColor: '#fff',// navigationBarTitleText: 'WeChat',// navigationBarTextStyle: 'black'},tabBar: {custom: true,color: '#333',selectedColor: '#058fae',list: [{pagePath: 'pages/index/index',text: '首页',iconPath: 'assets/images/tabBar/icon1.png',selectedIconPath: 'assets/images/tabBar/icon1-active.png'},{pagePath: 'pages/about/index',text: '关于',iconPath: 'assets/images/tabBar/icon2.png',selectedIconPath: 'assets/images/tabBar/icon2-active.png'}]},usingComponents: {},lazyCodeLoading: 'requiredComponents'
});

1. Webpack 场景

Taro + Webpack 这样的方案,官方在构建时会把 app.json 里的

"tabBar": {"custom": true,"list": [...]
}

以及 custom-tab-bar 目录下的代码一并编译进产物,微信小程序就能识别并使用自定义 tab bar。

2. Vite 场景

目前(尤其是 Taro Vite 模式),Vite 插件对小程序 非页面/组件目录 的处理不完整:

  • custom-tab-bar 目录不会被默认打包

  • 导致运行时找不到 custom-tab-bar/index,从而退回使用原生 tab bar

所以表现就是:Webpack 能跑,Vite 不能跑。

3. 解决方案

如果要在 Vite 模式下使用自定义 tabbar,需要额外配置。完整的 vite.config.ts 示例,包含了 custom-tab-bar 的处理配置。这样在 Vite 模式下打包时,会自动把 src/custom-tab-bar 目录复制到小程序 dist 目录中,微信就能正常识别自定义 tabbar。(注意custom-tab-bar文件位置一定是在src下和page同级,这是官网定义的

import { defineConfig } from 'vite'
import { viteStaticCopy } from 'vite-plugin-static-copy'
export default defineConfig({plugins: [viteStaticCopy({targets: [{src: 'src/custom-tab-bar', // custom-tab-bar 源目录dest: ''                   // 复制到 dist/custom-tab-bar}]})],build: {outDir: 'dist', // 小程序编译输出目录emptyOutDir: true}
})

二、推荐使用京东NutUI-React Taro开发小程序(推荐方式一,简单方便)

官网步骤:NutUI-React Taro

安装 Taro 脚手架

# pnpm
pnpm install -g @tarojs/cli
# npm
npm install -g @tarojs/cli
# yarn
yarn global add @tarojs/cli

方式一:使用 Taro 内置的 NutUI 模板快速创建项目

1、使用命令创建 Taro 项目:
taro init
2、参考下方操作,选择 NutUI React 模板
 Taro
Taro 即将创建一个新项目!
Need help? Go and open issue: https://tls.jd.com/taro-issue-helper
? 请输入项目名称! MyProject
? 请输入项目介绍
? 请选择框架 React
? 是否需要使用 TypeScript ? Yes
? 请选择 CSS 预处理器(Sass/Less/Stylus) Sass
? 请选择编译工具 Webpack5
? 请选择包管理工具 pnpm
? 请选择模板源 Github(最新)
✔ 拉取远程模板仓库成功!默认模板harmonymobxpwa
❯ react-NutUI(使用 NutUI React 的模板)react-native......

方式二:在已有 Taro 项目中引入 NutUI React

1、安装 NutUI React
# pnpm
pnpm add @nutui/nutui-react-taro
# npm
npm i @nutui/nutui-react-taro
# yarn
yarn add @nutui/nutui-react-taro
2、Taro 相关配置

安装 @tarojs/plugin-html

注意,这里安装的版本 version 必须与项目中 Taro 版本保持一致!

# pnpm
pnpm add @tarojs/plugin-html@version
# yarn
yarn add @tarojs/plugin-html@version
# npm
npm i @tarojs/plugin-html@version

在项目中配置

// config/index.js
config = {// 开启 HTML 插件plugins: ['@tarojs/plugin-html'],designWidth(input) {// 配置 NutUI 375 尺寸if (input?.file?.replace(/\\+/g, '/').indexOf('@nutui') > -1) {return 375}// 全局使用 Taro 默认的 750 尺寸return 750},deviceRatio: {640: 2.34 / 2,750: 1,828: 1.81 / 2,375: 2 / 1,},
}
3、组件使用与按需引入

您可以选择全量引入样式文件:

// 默认主题
import '@nutui/nutui-react-taro/dist/style.css'
// 默认主题暗黑模式
// import '@nutui/nutui-react-taro/dist/style.css'
// JMAPP 主题
// import '@nutui/nutui-react-taro/dist/style-jmapp.css'
// JRKF 主题
// import '@nutui/nutui-react-taro/dist/style-jrkf.css'
3.1、通过插件实现按需引入

需要注意的是,在手动按需加载时,你还需要在入口文件中引入 global 类的文件来加载一些 NutUI React Taro 的全局性逻辑和样式:

// css 主题文件路径
// 默认主题
import '@nutui/nutui-react-taro/dist/styles/themes/default.css'
// 默认暗黑主题
// import '@nutui/nutui-react-taro/dist/styles/themes/default-dark.css'
// JMAPP 主题
// import '@nutui/nutui-react-taro/dist/styles/themes/jmapp.css'
// JRKF 主题
// import '@nutui/nutui-react-taro/dist/styles/themes/jrkf.css'
// scss 主题文件路径
// 默认主题
// import '@nutui/nutui-react-taro/dist/styles/theme-default.scss'
// 默认暗黑主题
// import '@nutui/nutui-react-taro/dist/styles/theme-dark.scss'
// JMAPP 主题
// import '@nutui/nutui-react-taro/dist/styles/theme-jmapp.scss'
// JRKF 主题
// import '@nutui/nutui-react-taro/dist/styles/theme-jrkf.scss'

首先安装 babel-plugin-import 插件

# pnpm
pnpm add babel-plugin-import
# npm
npm i babel-plugin-import
# yarn
yarn add babel-plugin-import

入口文件需要引入全局样式

// app.js
// css 主题文件路径
// 默认主题
import '@nutui/nutui-react-taro/dist/styles/themes/default.css'
// 默认暗黑主题
// import '@nutui/nutui-react-taro/dist/styles/themes/default-dark.css'
// JMAPP 主题
// import '@nutui/nutui-react-taro/dist/styles/themes/jmapp.css'
// JRKF 主题
// import '@nutui/nutui-react-taro/dist/styles/themes/jrkf.css'
// scss 主题文件路径
// 默认主题
// import '@nutui/nutui-react-taro/dist/styles/theme-default.scss'
// 默认暗黑主题
// import '@nutui/nutui-react-taro/dist/styles/theme-dark.scss'
// JMAPP 主题
// import '@nutui/nutui-react-taro/dist/styles/theme-jmapp.scss'
// JRKF 主题
// import '@nutui/nutui-react-taro/dist/styles/theme-jrkf.scss'

babel 相关配置:

// babel.config.js
module.exports = {presets: [// ...],plugins: [['import',{libraryName: '@nutui/nutui-react-taro',camel2DashComponentName: false,customName: (name, file) => {return `@nutui/nutui-react-taro/dist/es/packages/${name.toLowerCase()}`},// 自动加载 scss 样式文件customStyleName: (name) =>`@nutui/nutui-react-taro/dist/es/packages/${name.toLowerCase()}/style`,// 自动加载 css 样式文件// customStyleName: (name) => `@nutui/nutui-react-taro/dist/es/packages/${name.toLowerCase()}/style/css`// JMAPP 主题// 自动加载 scss 样式文件// customStyleName: (name) => `@nutui/nutui-react-taro/dist/es/packages/${name.toLowerCase()}/style-jmapp`,// 自动加载 css 样式文件// customStyleName: (name) => `@nutui/nutui-react-taro/dist/es/packages/${name.toLowerCase()}/style-jmapp/css`// jrkf 端主题// 自动加载 scss 样式文件// customStyleName: (name) => `@nutui/nutui-react-taro/dist/es/packages/${name.toLowerCase()}/style-jrkf`,// 自动加载 css 样式文件// customStyleName: (name) => `@nutui/nutui-react-taro/dist/es/packages/${name.toLowerCase()}/style-jrkf/css`},'nutui-react',],],
}

若您的项目采用 scss,则需要在 config/index 中增加如下配置:

{sass: {data: '@import "@nutui/nutui-react-taro/dist/styles/variables.scss";'// JMAPP 主题// data: `@import '@nutui/nutui-react-taro/dist/styles/variables-jmapp.scss';`// JRKF 主题// data: `@import '@nutui/nutui-react-taro/dist/styles/variables-jrkf.scss';`}
}

注意事项

1、检查 Taro 是否安装成功
taro -v

出现 Taro 版本号说明安装成功。

2、安装 Taro 过程中出现 Saas 相关错误

可以考虑安装 mirror-config-china 后重试。

npm install -g mirror-config-china
3、小程序项目运行时出现「找不到模板」的错误提示

解决方案:在 Taro 配置文件中关闭 prebundle 及 cache

// config/index.js
config = {compiler: {type: 'webpack5',prebundle: {exclude: ['@nutui/nutui-react-taro', '@nutui/icons-react-taro'],},},cache: {enable: false,},
}
4、样式单位转化

组件 CSS 单位使用的是 px,但是在 Taro 编译时,Taro 会帮你对样式做尺寸转换操作,需要注意的是,要对 NutUI 相关的样式设置在黑名单里,如:

// config/index.js
config = {h5: {postcss: {pxtransform: {enable: true,// 包含 `nut-` 的类名选择器中的 px 单位不会被解析config: { selectorBlackList: ['nut-'] },},},},
}

三、总结

        使用NutUI-React Taro,操作简单易上手,开发简洁快速。根据步骤即可,也不会出现custom-tab-bar不生效问题。选用的是webpack,scss和less可根据自己习惯选用那个。

  • Webpack 是官方长期维护的稳定方案,能自动识别 custom-tab-bar

  • Vite 模式下需要 手动处理 custom-tab-bar 的输出升级 Taro 插件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/926192.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

做影视外包的网站优化方案怎么写

长期佩戴耳机可能会出现听力下降、耳道感染等危害。 听力下降:长时间戴耳机可能会导致耳道内的声音过大,容易对耳膜造成一定的刺激,容易出现听力下降的情况。 耳道感染:长时间戴耳机,耳道长期处于封闭潮湿的情况下&a…

免费com域名网站湖北省勘察设计协会网站

我们新项目硬件设计上使用gpio口做按键,所以我就需要搞定这个驱动,本来想自己写一个gpio口的按键驱动,然后看了下内核下面的代码,已经有现成的了。Linux内核下游很多很多的现成驱动,只要你想得到的,基本都是…

获胜者网站建设旅游网页素材

目录 1、享元模式(Flyweight Pattern)含义 2、享元模式的UML图学习 3、享元模式的应用场景 4、享元模式的优缺点 5、C实现享元模式的简单实例 1、享元模式(Flyweight Pattern)含义 享元模式(Flyweight&#xff09…

深圳网站建设 设计首选中国建设银行南京分行网站首页

儿童安全门和围栏 儿童安全门和围栏用于在门口(如门道)内设置围栏,或用作自支撑围栏,将幼儿可能在其中活动的区域围起来。这些商品可能由塑料、金属、乙烯树脂或木制组件等材料制成。此政策包括但不限于可扩展围栏、伸缩安全门和…

最短路练习

最短路为背景的题 + 做法是最短路的题A - Minimum Path https://www.luogu.com.cn/problem/CF1473E经典套路,发现可以把 max 和 min 换成任意路径中的边,然后 max 和 min 就会最小化这个式子 故写一个 Dijkstra + DP…

东莞网站建设选择菲凡网络wordpress布局切换功能

题目: P2024 [NOI2001] 食物链 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 本文学习自: 题解 P2024 【食物链】 - RE: 从零开始的异世界信竞生活 - 洛谷博客 (luogu.com.cn) ———— 关系并查集其实就是在普通并查集的基础上额外开个数组r…

依据XShell采用Git三板斧

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

沈阳微信网站制作重庆市建设工程管理网

文章来源:芯片开放社区,作者:OCC编辑万里征途迈出第一步,基于RISC-V的安卓10系统来了。点击链接查案演示视频: 平头哥芯片开放社区(OCC)​occ.t-head.cn今天,平头哥完成了安卓10对RISC-V的移植并开源了全部…

什么网站做ppt赚钱app下载注册量推广平台

spring4单切面 spring4多切面 spring4 spring5

杂题,为什么博客的标题必须互异

不会的东西越来越多了B. K-Set Tree https://www.luogu.com.cn/problem/CF1691F 令 \(F_i\) 表示以 \(1\) 为根时,\(S\) 在 \(i\) 子树内的答案。则: \[F_u=\left(C_{siz_u}^k-\sum C_{siz_v}^k\right)\cdot siz_u+\…

学习笔记:压位高精

把 ddxrS 吓到了,发出惊世疑问:『为什么高二机房正在激烈地讨论怎么写高精度?』考虑 10-base 高精度,单次运算复杂度为 \(O(\log_{10}V)\)。使用 10-base 的主要原因是 std::to_string 很方便、输出也很简单。 但效…

响应式网站有什么弊端微信公众号做推送的网站

本文详解WPF的Button控件。 目录 前言 定义 属性 事件 应用实例 1、普通应用

吉司机 + 历史和练习

并非所有历史和都是吉司机A - Just Another Game of Stones https://www.luogu.com.cn/problem/P9631发现如果选定了这一步取的位置 \(i\),那么要拿的石子是定值 \(a_i-a_i\oplus s\),当 \(a_i\le a_i\oplus s\) 时不…

探索3D空间的视觉基础模型系列 - 指南

探索3D空间的视觉基础模型系列 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mona…

近期杂题,怎么重名了

突围E - Colinear https://atcoder.jp/contests/abc422/tasks/abc422_e 看到题目会有一个乱搞的想法:随机取一对点,那么是有 \(\dfrac 14\) 的概率都在直线上的。带进去暴力 check 一下,多来几次正确率就比较高。 什…

可以做配音兼职的网站微信网站怎么做的好名字

目录 HarmonyOS设备开发学习路径一、开发项目与工具介绍1.1、设备开发环境准备1.2、设备开发流程1.3、Huawei DevEco Device Tool 二、OpenHarmony介绍OpenHarmony目录结构详细介绍applications目录详解base目录详解foundation目录详解 OpenHarmony接口分层介绍CMSIS 和 POSIX …

vp 记录 edu 181

tzl 太强了!真挚的膜拜lhy 太强了!真挚的膜拜E. Sets of Complementary Sums https://codeforces.com/contest/2125/problem/E 分拆数、其实是个不牛的东西,但是写假了 😅 令集合元素升序排列为 \(b_{1\sim n}\)。…

状压 DP

没补完(1/3),动作还是太慢了A - 只不过是长的领带 2 / Just Long Neckties 2 https://www.luogu.com.cn/problem/P11665 需要观察到,任意时刻 \(B\) 中不存在重复元素。把 \(B\) 压出来,令 \(f_{i,S}\) 表示选了 …

近期杂题

这段时间比赛的一些题 和 nKessi、duanyu 讲的题目。太偏计数、数学的基本上没办法做了。A. 出关 http://222.180.160.110:61235/contest/6462/problem/1给定 \(s\),对于一个空串,任意利用下列三种操作,使其变为 \(…

学习笔记:分拆数与 Ferrers 图

需要知道概念和求法,有一定的用处分拆数与互异分拆数 要求:给定一个正整数 \(n\),要求将其划分为 \(m\) 个可重 / 不可重的正整数,问本质不同的方案数。(显然 \(m\) 与 \(\sqrt n\) 同阶。) 不妨令划分结果单调不…