Vite + Vue3 使用 cdn 引入依赖,并且把外部 css、js 文件内联引入

  1. 安装插件
pnpm i element-plus echarts axios lodash -S
  1. 在 vite.config.js 引用

注意事项:element-plus 不能在 vite.config.js 中使用按需加载,需要在 main.js 中全局引入;

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

// 引入 vite-plugin-cdn-import 插件
import { Plugin as importToCDN } from 'vite-plugin-cdn-import'

const pathSrc = resolve(__dirname, 'src')
// https://vitejs.dev/config/
export default defineConfig({
  // 打包base访问地址,和webpack 的base一样,默认 ./ 就好了
  base: './',
  plugins: [
    vue(),
    // 配置 CDN
    importToCDN({
      modules: [
        {
          name: 'vue',
          var: 'Vue',
          path: 'https://cdn.jsdelivr.net/npm/vue@3.5.10/dist/vue.global.min.js'
        },
        {
          name: 'element-plus', // 依赖名称,
          var: 'ElementPlus', // 全局变量名
          path: 'https://cdn.jsdelivr.net/npm/element-plus@2.8.4/dist/index.full.min.js', // CDN 链接
          css: 'https://cdn.jsdelivr.net/npm/element-plus@2.8.4/dist/index.min.css' // 依赖有css就填,没有就去掉这个
        },
        {
          name: 'axios',
          var: 'axios',
          path: 'https://cdn.jsdelivr.net/npm/axios@1.7.7/dist/axios.min.js'
        },
        {
          name: 'echarts',
          var: 'echarts',
          path: 'https://cdn.jsdelivr.net/npm/echarts@5.5.1/dist/echarts.min.js'
        },
        {
          name: 'lodash',
          var: '_',
          path: 'https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js'
        }
      ]
    }),
    {
      name: 'inline-js-css',
      apply: 'build', // 仅在构建阶段生效
      enforce: 'post', // 在其他插件之后执行
      generateBundle(outputOptions, bundle) {
        for (const fileName in bundle) {
          const asset = bundle[fileName]
          // 获取HTML文件
          const htmlFile = bundle['index.html']
          if (!htmlFile) return
          // 删除原始JS/CSS文件代码
          if (fileName.endsWith('.html')) {
            // console.log(asset)
            // 删除原始JS/CSS文件引入
            htmlFile.source = htmlFile.source.replace(
              /<script type="module".*<\/script>/g,
              ''
            )
            htmlFile.source = htmlFile.source.replace(
              /<link rel="stylesheet".*\.css">/g,
              ''
            )
          } else if (fileName.endsWith('.js')) {
            // 将JS内联到HTML文件中
            htmlFile.source += `\n<script>\n${asset.code}\n</script>\n`
            // 删除原始JS文件
            delete bundle[fileName]
          } else if (fileName.endsWith('.css')) {
            // 将CSS内联到HTML文件中
            htmlFile.source += `\n<style>\n${asset.source}\n</style>\n`
            // 删除原始CSS文件
            delete bundle[fileName]
          }
        }
      }
    }
  ],
  server: {
    host: '0.0.0.0',
    .......
  }
})
  1. main.js 引入

CDN 引入只有在 build 打包出来的才是 CDN 引入,本地开发走的还是 NPM 本地包引入, 所以先使用 NPM 方式引入

import { createApp, provide } from 'vue'
import ElementPlus from 'element-plus'
import './style.scss'
import App from './App.vue'

createApp(App)
  .provide('global', {
    theme: 'theme-white'
  })
  .use(ElementPlus)
  .mount('#app')
  1. 打包测试

执行打包 命令npm run build,依赖变为 CDN 引入,外部的 js 文件和 css 文件集成到 index.html 中

打包结果

Vite + Vue3项目中遇到“require is not defined”的错误通常是因为你在尝试使用CommonJS模块导出导入机制,而Vite 默认采用的是ES module(ESM)。这在Vue组件内直接使用`import`和`export`语法是可以避免这个问题的。如果你需要引入第三方库,有几种解决方法: 1. **使用vite-plugin-commonjs**:这是一个Vite 插件,它允许你在项目中混合使用CommonJS和ESM。安装并配置这个插件后,你可以像下面这样导入第三方库: ```bash npm install vite-plugin-commonjs -D ``` 在`vite.config.js`中添加: ```javascript import commonjs from &#39;vite-plugin-commonjs&#39; export default defineConfig({ plugins: [ commonjs(), ], }) ``` 2. **将第三方库转换为ESM**:如果可能,尽量将第三方库转换为其ESM版本。很多库现在都支持这种转换,例如 `npm run build -- @某库名` 或者检查其是否有umd版本。 3. **全局引入**:对于一些全局作用域的库,可以在项目的根目录下创建一个`.esm`文件(如`global-utils.esm.js`),然后导入并导出: ```javascript // global-utils.esm.js export { default as myLib } from &#39;my-third-party-lib&#39;; ``` 然后在其他组件中使用`import * as myLib from &#39;@/global-utils&#39;`。 4. **条件加载**:如果有必要,可以使用`@vitejs/plugin-vue-router`的`defineAsyncComponent`来动态导入和延迟加载第三方库,以减少初始加载时的问题。 记得每次更改后都要重启Vite服务查看是否解决了问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值