veaury icon indicating copy to clipboard operation
veaury copied to clipboard

可否提供一份在React项目中使用Vue3组件的Vite配置文件

Open pawover opened this issue 2 years ago • 18 comments

在issues中只找到了Vue项目使用React组件的配置

我想尝试一下这个库,谢谢

pawover avatar Jun 27 '22 14:06 pawover

@Handpear 你是react的vite项目是吧?配置如下

vite.config.js

// vite.config.js
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'

export default defineConfig({
  plugins: [
    react({
      babel: {
        exclude: [/\.vue$/]
      }
    }),
    vue(),
    vueJsx({
      include: [/\.vue$/]
    }),
  ]
})

App.jsx

import { applyVueInReact } from 'veaury'
import AAAVue from './AAA.vue'
const AAA = applyVueInReact(AAAVue)

function App() {
  return <AAA/>
}

export default App

devilwjp avatar Jun 27 '22 16:06 devilwjp

@devilwjp 感谢,在React 17 中测试成功了,但是 React 18 中会报错,但似乎不是 veaury 的问题 image 有办法解决吗

pawover avatar Jun 28 '22 02:06 pawover

好吧,是 TS 的断言被编译进了代码里,我看看怎么修改

pawover avatar Jun 28 '22 02:06 pawover

似乎 vite 失去了对 ts 的编译能力?

pawover avatar Jun 28 '22 02:06 pawover

似乎 vite 失去了对 ts 的编译能力?

@Handpear 修改配置如下,记得安装@vue/babel-plugin-jsx
此配置会将.vue文件中的jsx以vuejsx解析,如果需要其他文件也进行vuejsx解析,在overrides.incluede里继续添加正则

import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import vue from '@vitejs/plugin-vue'

export default defineConfig({
  plugins: [
    vue(),
    react({
      babel: {
        // 预设vuejsx插件处于关闭状态
        plugins: [['@vue/babel-plugin-jsx', false]],
        overrides: [{
          // 将vuejsx插件开启
          include: [/vue&type=script&lang\.[tj]sx?$/],
          plugins: ['@vue/babel-plugin-jsx']
        }]
      }
    }),
  ]
})

devilwjp avatar Jun 28 '22 16:06 devilwjp

@Handpear 升级到2.1.1版本

import { defineConfig } from 'vite'
// >= [email protected]
import veauryVitePlugins from 'veaury/vite'

export default defineConfig({
  plugins: [
    // 关闭 react plugin
    // react(),
    // 当type设置为react, 
    // 只有.vue文件中的jsx会被以vue jsx编译, 
    // 其他的文件中的jsx都会被以react jsx编译
    veauryVitePlugins({
      type: 'react'
    })
  ]
})

devilwjp avatar Jun 30 '22 17:06 devilwjp

@devilwjp 感谢,其实上一版的配置已经能用了,只不过Eslint把所有React jsx 都识别为了 Vue jsx,tsconfig文件肯定是需要两个的,设置不同的 jsx 模式,但 eslint 是需要通过 overrides 字段复写文件类型吗?

pawover avatar Jul 01 '22 05:07 pawover

@Handpear 我最近回复的两个配置都能用的,最后一个配置只是把前一个配置包装了一下而已
是因为vueJsx插件会默认设置vite的esbuild的include为/.ts/,也就是只让esbuild只处理ts文件的typescript编译,其他文件都默认走vueJsx插件使用babel的ts插件,但是比较可惜的是vueJsx的vite插件并没后设置enforce为pre,导致优先级不如react插件(因为react插件设置了enforce为pre),所以正确的配置是依旧使用react插件,但是预先把@vue/babel-plugin-jsx插入到react插件的plugins里(优先级最高,但是设置为关闭),然后就通过overrides来做条件的匹配选择是否开启vue的jsx编译即可

devilwjp avatar Jul 01 '22 06:07 devilwjp

vue3引入react组件,按此库文档操作更改balel配置,运行出错,貌似没构建,有大佬知晓麻烦回复回复嘛 企业微信截图_16602889176586(1) 企业微信截图_16602891301073(1)

Candidade avatar Aug 16 '22 07:08 Candidade

@Candidade vue3引入react,如果你是webpack,参考一下我的文档关于webpack的部分,应该使用veaury的babel插件

devilwjp avatar Sep 27 '22 19:09 devilwjp

vite vue3使用react,使用了阿里的@antv/auto-chart目前未成功。

Fucntion avatar Dec 07 '22 09:12 Fucntion

最新版插件在vite3 vue3中使用react情况下第二种配置报下面错 image

换用第一种方式正常,估计是包装有问题

xiaobc1234 avatar Mar 08 '23 03:03 xiaobc1234

@xiaobc1234 请直接使用veaury的vite插件

https://github.com/devilwjp/veaury#vite

devilwjp avatar Mar 08 '23 03:03 devilwjp

@Fucntion 提供一个例子给我

devilwjp avatar Mar 08 '23 03:03 devilwjp

@xiaobc1234 请直接使用veaury的vite插件

https://github.com/devilwjp/veaury#vite

我一开始是这么用的,但是报上面的错,换成第一种方式就正常:

"veaury": "^2.3.12"


export default defineConfig({
  resolve: {
    alias: {
      vue: 'vue/dist/vue.esm-bundler.js',
      '/@': resolve(__dirname, './src'),
      '@src': resolve(__dirname, './src'),
      '@services': resolve(__dirname, './src/services'),
    },
  },
  plugins: [
    // veaury插件需要 关闭 vue 和 vuejsx 插件
    // vue(),
    // vueJsx(),
    veauryVitePlugins({
      type: 'vue',
    }),
    AutoImport({
      dts: 'src/auto-imports.d.ts',
      imports: ['vue', 'vue-router'],
      eslintrc: {
        enabled: true,
        filepath: './.eslintrc-auto-import.json',
        globalsPropValue: true,
      },
    }),
    // https://github.com/jpkleemans/vite-svg-loader
    svgLoader(),
    // https://github.com/antfu/vite-plugin-components
    Components({
      extensions: ['vue'],
      dts: 'src/components.d.ts',
      deep: true,
      dirs: ['src/components'],
      resolvers: [
        AntDesignVueResolver({
          importStyle: false,
        }),
      ],
    }),
    ViteFonts({
      google: {
        families: ['Open Sans', 'Montserrat', 'Fira Sans'],
      },
    }),
    Unocss({
      /* options */
    }),
    VueI18n({
      include: [resolve(__dirname, './locales/**')],
    }),
  ],
  css: {
    preprocessorOptions: {
      less: {
        javascriptEnabled: true,
        modifyVars: {
          // hack: `true; @import 'ant-design-vue/dist/antd.variable.less'`,
          // '@primary-color': '#eb2f96', // 全局主色
        },
      },
    },
  },
  optimizeDeps: {
    include: [
      'vue',
      'vue-router',
      '@vueuse/core',
      '@ant-design/icons-vue',
      'ant-design-vue/es',
      '@ant-design-vue/pro-layout',
    ],
    exclude: ['vue-demi'],
  },
});

function configure(proxy, options) {
  // 本地可直接走登录流程,无需手动设置cookie了。
  proxy.on('proxyRes', function (proxyRes, req, res) {
    console.log('proxy url: ', req.url);
    if (proxyRes.headers['set-cookie']) {
      proxyRes.headers['set-cookie'] = proxyRes.headers['set-cookie'].map(cookie => {
        return cookie.replace(/domain\=.+?;/, '');
      });
    }
  });
}

xiaobc1234 avatar Mar 08 '23 03:03 xiaobc1234

@xiaobc1234 你截图中的错,就是把react的jsx以vue的方式去解析了,你的react组件是放在什么目录下的,默认必须放在react_app目录下、

devilwjp avatar Mar 08 '23 05:03 devilwjp

@xiaobc1234 你截图中的错,就是把react的jsx以vue的方式去解析了,你的react组件是放在什么目录下的,默认必须放在react_app目录下、

哦,我这没有react_app目录,组件是放在src/components/react-comp 下面的

xiaobc1234 avatar Mar 08 '23 07:03 xiaobc1234

@xiaobc1234 嗯,如果想改变放置的目录规则,就需要配置一下veaury的vite插件

devilwjp avatar Mar 08 '23 09:03 devilwjp