【踩坑】vite项目使用ant<a-date-picker />提示报错 rr.isMoment is not a function 解决方法

文章描述了一个在Vite项目中使用antdv的日期选择器组件时遇到的`moment.isMomentisnotafunction`错误。作者分析了错误原因,可能是由于antd与vite的兼容性问题。尝试了引入cdn资源和各种插件修复未果。最终提出了两种解决方案:一是将项目改为vue-cli或webpack构建;二是通过vite-plugin-antd-use-dayjs插件将antd中的moment替换为dayjs,成功解决了日期选择器的问题。


1、问题描述

      项目技术栈:vue@2.6.10、ant-design-vue@1.7.8、vite@2.8.0

      在 vite 项目中,使用 antdv  <a-date-picker/> 组件通过 disabledDate 参数限制可选日期时,发现无法选中日期,控制台提示报错:rr.isMoment is not a function 

2、分析原因

     经排查,报错代码位于 antd 框架内置 moment-util.js 文件 moment.isMoment 方法。由于 antd 主要是通过 webpack 方式打包的,分析可能是低版本 antd 没有完全兼容 vite 开发环境,然而 ant-design-vue@1.7.8 已经不再支持维护了…… 既然这是源码报错,那要怎么办呢? 

3、解决方法

      起初通过全网搜寻解决方法,却发现没有相关技术文章。尝试通过 cdn 方式引入 antd.min.js,然而并没有解决问题……

<script src="https://cdn.jsdelivr.net/npm/ant-design-vue@1.7.8/dist/antd.min.js"></script>

     由于是框架源码出现异常,不太好改动,只能通过引入插件方式打补丁,在 npmjs 官网找到相应插件 ant-design-vue-vite、ant-design-vue-vite-fix、vite-plugin-antdv-fix,然而在项目引入这些插件后,依旧没能解决这个报错问题……

      在经过一番探索后,终于找到两个还不错的解决方法。

     1)方法一:调整项目构建工具(彻底性解决)

     直接将 vite 项目改用 vue-cli 或 webpack 构建工具,这是最直接的解决方法,能彻底解决依赖兼容问题。不过,对于开发程度较高的项目而言,此时调整项目构建工具的成本可能会大一些。

     2)方法二:替换Moment插件(针对性解决)

     既然这个报错本质上是 antd 内置 moment.isMoment( ) 方法执行异常,那么换一个思路,能否绕过这个日期库的报错呢?

     经过查询相关资料发现,通过引入插件可修改 antdv 内置 moment ,在 npmjs 官网找到相关插件 antd-dayjs-webpack-plugin、antd-dayjs-vite-plugin、vite-plugin-antd-use-dayjs 等。经过实践后,发现引入 vite-plugin-antd-use-dayjs 插件能实现将 antd 内置 moment 转成 dayjs,绕过源码的 isMoment 报错问题,成功解决 date-picker 选值异常问题。

npm i @wry-smile/vite-plugin-antd-use-dayjs

// vite.config.js 或 vite.config.ts 
import { vitePluginAntdUseDayjs } from '@wry-smile/vite-plugin-antd-use-dayjs'
export default defineConfig({
  plugins: [
    // default locale zh-cn
    vitePluginAntdUseDayjs.vite(),
  ],
})

执行代码可见,<a-date-picker /> @change 方法输出值不再是moment格式,而是dayjs格式。

<think>我们正在处理一个关于Vue 3中使用`<script lang="jsx" setup>`时遇到的启动错误:`t.isIdentifier is not a function at Array.map (<anonymous>)`。 根据错误信息,这通常与Babel解析JSX语法有关。我们需要注意,Vue 3默认使用`@vue/babel-preset-app`(对于Vue CLI项目)或`@vitejs/plugin-vue`(对于Vite项目)来处理JSX/TSX。 可能的原因及解决方案: 1. **Babel配置问题**:可能是由于Babel插件版本不兼容或配置不正确导致。特别是当我们使用JSX时,需要确保有正确的预设(preset)和插件。 2. **依赖版本问题**:可能是相关依赖(如Babel或JSX转换插件)的版本不兼容。 3. **Vue JSX转换插件**:Vue 3推荐使用`@vue/babel-plugin-jsx`来处理JSX。我们需要确保已安装并正确配置。 具体步骤: 步骤1:安装必要的依赖 确保已安装`@vue/babel-plugin-jsx`。对于Vue CLI项目: ```bash npm install @vue/babel-plugin-jsx -D # 或者 yarn add @vue/babel-plugin-jsx -D ``` 步骤2:配置Babel 在项目根目录下的`babel.config.js`文件中,添加该插件: ```javascript module.exports = { presets: [ '@vue/cli-plugin-babel/preset' ], plugins: [ '@vue/babel-plugin-jsx' ] } ``` 如果是Vite项目使用vite-plugin-vue),通常不需要额外配置Babel,因为Vite使用esbuilt。但如果你在Vite使用了Babel(例如通过`vite-plugin-babel`),那么同样需要配置这个插件。 步骤3:检查其他配置 如果你使用的是TypeScript(TSX),确保你的文件扩展名为`.tsx`,并且在`<script>`标签中设置`lang="tsx"`。 步骤4:检查依赖版本 确保所有相关依赖的版本兼容。特别是: - `@vue/babel-plugin-jsx` 版本应与Vue 3兼容(最新版即可)。 - 检查`@vue/cli-plugin-babel`(Vue CLI项目)或`@vitejs/plugin-vue`(Vite项目)的版本。 步骤5:清除缓存并重新安装 有时候缓存可能导致问题,尝试清除node_modules和package-lock.json,然后重新安装: ```bash rm -rf node_modules rm package-lock.json # 或者 yarn.lock npm install ``` 步骤6:检查JSX语法 确保你的JSX语法正确。这个错误可能是由于某个地方写错了JSX,导致Babel解析失败。检查报错的文件和行号。 如果以上步骤不能解决问题,请提供更多信息,如项目配置(Vue CLI还是Vite)、依赖版本等。 引用说明:虽然没有直接引用,但根据问题本身和之前提供的引用内容(引用[1]和[2])都是关于Vue 3的,说明用户正在使用Vue 3开发,可能是在使用JSX时遇到了问题。 §§ 相关问题§§ 1. 如何在Vue 3中配置JSX支持? 2. Vue 3中使用JSX和模板(template)有何区别? 3. 如何解决Vue 3项目中Babel相关的其他常见错误? </think> 根据错误信息`t.isIdentifier is not a function at Array.map (<anonymous>)`,这通常是由 Babel 解析器配置问题引起的,特别是当使用 JSX/TSX 语法且 Babel 插件版本不兼容时。以下是具体解决方案: ### 解决方案步骤 1. **升级 Babel 依赖** ```bash npm install @babel/core@latest @vue/babel-preset-app@latest # 或 yarn add @babel/core@latest @vue/babel-preset-app@latest ``` 2. **检查 Babel 配置**(`babel.config.js`) ```javascript module.exports = { presets: [ ["@vue/app", { useBuiltIns: "entry" // 确保启用 Polyfill }] ] } ``` 3. **添加 JSX 支持插件** ```bash npm install @vue/babel-plugin-jsx -D ``` 在 `babel.config.js` 中添加插件: ```javascript plugins: ["@vue/babel-plugin-jsx"] ``` 4. **清除构建缓存** ```bash rm -rf node_modules/.vite # Vite 项目 rm -rf node_modules/.cache # Webpack 项目 npm install ``` 5. **检查文件扩展名** - 使用 JSX 的文件扩展名应为 `.jsx` 或 `.tsx` - 在 SFC 中正确声明: ```vue <script lang="jsx" setup> // 或 <script lang="tsx" setup> ``` ### 常见原因 1. **Babel 插件版本过旧**(特别是 `@babel/traverse` 相关依赖) 2. **JSX 解析器配置缺失**(未安装 `@vue/babel-plugin-jsx`) 3. **构建工具缓存冲突**(Vite/Webpack 的缓存未更新) > **注意**:Vue 3 默认不支持 JSX,必须通过 `@vue/babel-plugin-jsx` 实现转换[^1]。如果使用 TSX,还需配置 `@babel/preset-typescript`。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值