国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

vite+vue3+ts搭建項目八(打包性能優(yōu)化三:使用CDN)

這篇具有很好參考價值的文章主要介紹了vite+vue3+ts搭建項目八(打包性能優(yōu)化三:使用CDN)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

vite+vue3+ts搭建項目八(打包性能優(yōu)化三:使用CDN)

使用vite-plugin-cdn-import

下載npm包

官方github:https://github.com/MMF-FE/vite-plugin-cdn-import

npm install vite-plugin-cdn-import --save-dev

開發(fā)環(huán)境使用本地的npm包,cdn是打包時候才生效

在vite.config.ts中通過importToCDN引入
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { autoComplete, Plugin as importToCDN } from "vite-plugin-cdn-import";
import { visualizer } from 'rollup-plugin-visualizer';

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue(),
    importToCDN({
      // prodUrl: 'https://cdn.jsdelivr.net/npm/{name}@{version}/{path}',
      modules: [
        {
          name: 'vue',
          var: 'Vue',
          path: `https://unpkg.com/vue@3.2.45/dist/vue.global.js`,
          
        },
        {
          name: 'vue-demi',
          var: 'VueDemi',
          path: `https://unpkg.com/vue-demi@0.13.11`,
        },
        {
          name: 'vue-router',
          var: 'VueRouter',
          path: `https://unpkg.com/vue-router@4.1.6`,
        },
        {
          name: 'element-plus',
          var: 'ElementPlus',
          path: 'https://unpkg.com/element-plus@2.3.3/dist/index.full.js',
          // css: 'https://unpkg.com/element-plus@2.3.3/dist/index.css'
        },
      ],
    }),
  ],
  // build: {
  //   rollupOptions: {
  //     external: ['vue', 'vue-demi', 'element-plus'],
  //   },
  // }
})

注意事項:網(wǎng)上很多教程,還需要在buildrollupOptions添加對應(yīng)的external,如上注釋所示,其實是不需要的,vite-plugin-cdn-import插件會自動幫我們完成這部分工作。

CDN參數(shù)獲取方式
  • name:npm包的名稱

    可以到https://www.jsdelivr.com進行查詢,以element-plus為例
    vite+vue3+ts搭建項目八(打包性能優(yōu)化三:使用CDN)
    vite+vue3+ts搭建項目八(打包性能優(yōu)化三:使用CDN)

  • var:組件(main.ts)引用的名稱
    比如ElementPlus

    import ElementPlus from 'element-plus'
    app.use(ElementPlus)
    
  • path:cdn網(wǎng)站存儲對應(yīng)的js地址
    輸入對應(yīng)名稱,會自動跳轉(zhuǎn)到對應(yīng)的js文件,復(fù)制粘貼,需要修改版本,和自己項目的package.json版本一致
    vite+vue3+ts搭建項目八(打包性能優(yōu)化三:使用CDN)

    允許只寫到版本,后面會自動補齊

    {
      name: 'vue-demi',
      var: 'VueDemi',
      path: `https://unpkg.com/vue-demi@0.13.11`,
    },
    
  • css:對應(yīng)位置,參考上圖element-plus
    需要注意的是,css可以使用本地的,使用本地的就不要添加css,使用遠程cdn的就需要在打包前注釋本地的,否則會出現(xiàn)樣式重疊。
    vite+vue3+ts搭建項目八(打包性能優(yōu)化三:使用CDN)

可用的CDN網(wǎng)址
name pordUrl
jsdelivr https://cdn.jsdelivr.net/npm/vue@3.2.47/dist/vue.global.min.js(例子)
unpkg //unpkg.com/{name}@{version}/{path}
cdnjs //cdnjs.cloudflare.com/ajax/libs/{name}/{version}/{path}
打包并運行
  • 打包后dist/index.html中自動添加了cdn鏈接
    vite+vue3+ts搭建項目八(打包性能優(yōu)化三:使用CDN)

  • 打包后放到nginx中運行,查看對應(yīng)依賴的加載地址
    vite+vue3+ts搭建項目八(打包性能優(yōu)化三:使用CDN)vite+vue3+ts搭建項目八(打包性能優(yōu)化三:使用CDN)

  • 打包后查看包體積
    例如element-plus,已經(jīng)被排除在外了
    vite+vue3+ts搭建項目八(打包性能優(yōu)化三:使用CDN)vite+vue3+ts搭建項目八(打包性能優(yōu)化三:使用CDN)

報錯整理
  • 報錯 TypeError: importToCDN is not a function
    vite+vue3+ts搭建項目八(打包性能優(yōu)化三:使用CDN)
  • 解決方法,修改import引入方式
    官方issues:https://github.com/MMF-FE/vite-plugin-cdn-import/issues/22
    // import importToCDN from "vite-plugin-cdn-import";
    import { autoComplete, Plugin as importToCDN } from "vite-plugin-cdn-import";
    

  • 報錯 Uncaught TypeError: Cannot read properties of undefined (reading 'createElementVNode')
    vite+vue3+ts搭建項目八(打包性能優(yōu)化三:使用CDN)vite+vue3+ts搭建項目八(打包性能優(yōu)化三:使用CDN)
    可以看到代碼里用到了vue
  • 解決:將vue也通過cdn引入即可

  • 報錯Uncaught ReferenceError: Vue is not defined
    vite+vue3+ts搭建項目八(打包性能優(yōu)化三:使用CDN)
    vue-router或某些組件需要依賴vue
  • 解決:將vue也通過cdn引入即可

  • 報錯 Uncaught TypeError: Failed to resolve module specifier "vue". Relative references must start with either "/", "./", or "../".
    vite+vue3+ts搭建項目八(打包性能優(yōu)化三:使用CDN)

    參考1:https://github.com/MMF-FE/vite-plugin-cdn-import/issues/13
    參考2:https://github.com/MMF-FE/vite-plugin-cdn-import/issues/32
    參考3:https://blog.csdn.net/qq_51634332/article/details/126325740

  • 解決:importToCDN時在引入vue后添加vue-demi,已在vite.config.ts中給出,其他插件在vue-demi之后(順序很重要)


  • vite-plugin-cdn-importunplugin-vue-componentsunplugin-auto-import不兼容
    參考:https://github.com/MMF-FE/vite-plugin-cdn-import/issues/13#issuecomment-1226897835
    使用importToCDN時,通過下面兩個插件的組件不生效,需要在每個組件單獨寫import
    import AutoImport from "unplugin-auto-import/vite"
    import Components from 'unplugin-vue-components/vite';
    
  • 原因
    之所以使用 AutoImport 后就會有問題,是因為 unplugin-auto-import 的 enforce 為 post ,會最后才執(zhí)行,導(dǎo)致通過 AutoImport 的注入的代碼沒有被此插件轉(zhuǎn)換
  • 解決方法
    目前只能暫時不同時使用這兩組插件,所以如果使用自動引入插件,這個插件不是最佳答案

直接按照下面這張方法是不行的,在vite.config.ts文件中,為importToCDN添加...擴展符,讓它在其他所有插件之后再加載

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { autoComplete, Plugin as importToCDN } from "vite-plugin-cdn-import";
import { visualizer } from 'rollup-plugin-visualizer';
import AutoImport from "unplugin-auto-import/vite"
import Components from 'unplugin-vue-components/vite';

export default defineConfig({
  plugins: [
    vue(),
    AutoImport({
      imports: ['vue', 'vue-router'],
      dts: "src/auto-import.d.ts",
    }),
    Components({
      //默認(rèn)存放位置
      //dts: "src/components.d.ts",
    }),
    {
      ...importToCDN({
        // prodUrl: 'https://cdn.jsdelivr.net/npm/{name}@{version}/{path}',
        modules: [
          {
            name: 'vue',
            var: 'Vue',
            path: `https://unpkg.com/vue@3.2.45/dist/vue.global.js`,
          },
          ...
        ],
      }),
      enforce: 'post',
      apply: 'build',
    },
  ],
  // build: {
  //   outDir: 'dist', // 指定輸出路徑
  //   // minify: 'terser', // 混淆器,terser 構(gòu)建后文件體積更小,'terser' | 'esbuild' ,默認(rèn)為esbuild
  //   rollupOptions: {
  //     external: ['vue', 'vue-demi', 'element-plus'],
  //   },
  // }
})

使用rollup-plugin-external-globals(推薦)

為了解決上面的問題,externalGlobals是可以用上面的方法延遲加載的
參考1:https://github.com/ttk-cli/vue3-template/tree/test/cdn1
參考2:https://free_pan.gitee.io/freepan-blog

下載npm包
npm install -D rollup-plugin-external-globals
在vite.config.ts中引入
  1. 允許設(shè)置延遲加載
  2. rollupOptions需要設(shè)置external
import externalGlobals from 'rollup-plugin-external-globals'

const externalGlobalsObj = {
  vue: 'Vue',
  'vue-demi': 'VueDemi',
  'vue-router': 'VueRouter',
  'element-plus': 'ElementPlus',
}

export default defineConfig({
  plugins: [
    vue(),
    {
      ...externalGlobals(externalGlobalsObj),
      enforce: 'post',
      apply: 'build',
    },
  ],
  build: {
    outDir: 'dist', // 指定輸出路徑
    rollupOptions: {
      external: Object.keys(externalGlobalsObj),
    },
  }
})
手動在打包后的index添加CDN
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Vite + Vue + TS</title>
    <script src="https://unpkg.com/vue@3.2.45/dist/vue.global.js"></script>
    <script src="https://unpkg.com/vue-demi@0.13.11"></script>
    <script src="https://unpkg.com/vue-router@4.1.6"></script>
    <script src="https://unpkg.com/element-plus@2.3.3/dist/index.full.js"></script>
    <script type="module" crossorigin src="/assets/index-c24c670c.js"></script>
    <link rel="stylesheet" href="/assets/index-f757e912.css">
  </head>
  <body>
    <div id="app"></div>
    
  </body>
</html>
自動添加CDN

需要用到vite-plugin-html插件
github官方:https://github.com/vbenjs/vite-plugin-html
參考:https://segmentfault.com/q/1010000041958028

  • 安裝
npm i vite-plugin-html -D
  • 在vite.config.ts中引入(完整配置文件內(nèi)容)
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { autoComplete, Plugin as importToCDN } from "vite-plugin-cdn-import";
import { visualizer } from 'rollup-plugin-visualizer';
// 自動導(dǎo)入vue中hook reactive ref等
import AutoImport from "unplugin-auto-import/vite"
// 自動導(dǎo)入ui-組件 比如說ant-design-vue  element-plus等
import Components from 'unplugin-vue-components/vite';
import externalGlobals from 'rollup-plugin-external-globals'
import { createHtmlPlugin } from 'vite-plugin-html'

const cdn = {
  css: [],
  js: [
    'https://unpkg.com/vue@3.2.45/dist/vue.global.js',
    'https://unpkg.com/vue-demi@0.13.11',
    'https://unpkg.com/vue-router@4.1.6',
    'https://unpkg.com/element-plus@2.3.3/dist/index.full.js',
  ],
}

const externalGlobalsObj = {
  vue: 'Vue',
  'vue-demi': 'VueDemi',
  'vue-router': 'VueRouter',
  // pinia: 'Pinia',
  'element-plus': 'ElementPlus',
}

// https://vitejs.dev/config/
export default defineConfig(({ mode }) => {
  const isProduction = mode === 'production';

  return {
    plugins: [
      vue(),
      AutoImport({
        //安裝兩行后,在組件中不用再導(dǎo)入ref,reactive等
        imports: ['vue', 'vue-router'],
        dts: "src/auto-import.d.ts",
        //element
      }),
      Components({
        //element
        //默認(rèn)存放位置
        //dts: "src/components.d.ts",
      }),
      visualizer({
        open: true,  //注意這里要設(shè)置為true,否則無效
        gzipSize: true,  //從源代碼中收集 gzip 大小并將其顯示在圖表中
        brotliSize: true, //從源代碼中收集 brotli 大小并將其顯示在圖表中
        emitFile: true, //在打包完的dist,否則在項目目錄下
        filename: "stats.html", //分析圖生成的文件名
      }),
      createHtmlPlugin({
        inject: {
          data: {
            cdnCss: isProduction ? cdn.css : [],
            cdnJs: isProduction ? cdn.js : [],
          },
        },
      }),
      {
        ...externalGlobals(externalGlobalsObj),
        enforce: 'post',
        apply: 'build',
      },
    ],
    build: {
      outDir: 'dist', // 指定輸出路徑
      // minify: 'terser', // 混淆器,terser 構(gòu)建后文件體積更小,'terser' | 'esbuild' ,默認(rèn)為esbuild
      rollupOptions: {
        external: Object.keys(externalGlobalsObj),
      },
    }
  }
})
  • 在 index.html 中增加 EJS 標(biāo)簽

    需要注意的是:這個index.html不是打包后的,是項目的入口index.html

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <link rel="icon" type="image/svg+xml" href="/vite.svg" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Vite + Vue + TS</title>
  <!-- 使用CDN的CSS文件 -->
  <% for (const i of cdnCss) { %>
  <link href="<%= i %>" rel="stylesheet" />
  <% } %>
  <!-- 使用CDN的JS文件 -->
  <% for (const i of cdnJs) { %>
  <script src="<%= i %>" defer></script>
  <% } %>
</head>

<body>
  <div id="app"></div>
  <script type="module" src="/src/main.ts"></script>
</body>

</html>

環(huán)境變量:https://www.cnblogs.com/yayuya/p/17035869.html

  • 打包后的結(jié)果
vite+vue3+ts搭建項目八(打包性能優(yōu)化三:使用CDN)

這樣就不需要手動引入了,但是需要添加一個新的npm包,實際項目中可以自行選擇是否添加

element-plus相關(guān)問題

使用cdn引入需要全局引入,不要使用AutoImport的按需引入,否則最后生成的包仍然會有本地的element-plus.js

按需引入和CDN只能選擇其一進行打包優(yōu)化

使用CDN則不使用resolvers: [ElementPlusResolver()],在main.ts全局引入element-plus即可

      AutoImport({
        //安裝兩行后,在組件中不用再導(dǎo)入ref,reactive等
        imports: ['vue', 'vue-router'],
        dts: "src/auto-import.d.ts",
        //element
        // resolvers: [ElementPlusResolver()],
      }),
      Components({
        //element
        //默認(rèn)存放位置
        //dts: "src/components.d.ts",
        // resolvers: [ElementPlusResolver()],
      }),
import 'element-plus/dist/index.css'
import ElementPlus from 'element-plus'
app.use(ElementPlus)

使用CDN未必會加快速度,只能減小打包體積,因為對應(yīng)js和css需要從遠程地址讀取

原文鏈接:http://guohaonan1.github.io/2023/04/12/vite-vue3-ts搭建項目八(打包性能優(yōu)化三:使用CDN)/文章來源地址http://www.zghlxwxcb.cn/news/detail-432962.html

到了這里,關(guān)于vite+vue3+ts搭建項目八(打包性能優(yōu)化三:使用CDN)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【vite+vue3.2 項目性能優(yōu)化實戰(zhàn)】使用vite-plugin-cdn-import進行CDN加速優(yōu)化項目體積

    【vite+vue3.2 項目性能優(yōu)化實戰(zhàn)】使用vite-plugin-cdn-import進行CDN加速優(yōu)化項目體積

    CDN (Content Delivery Network)即內(nèi)容分發(fā)網(wǎng)絡(luò),是一種通過在全球范圍內(nèi)分布式部署服務(wù)器來加速網(wǎng)絡(luò)內(nèi)容傳輸?shù)募夹g(shù)。CDN加速的原理是,當(dāng)用戶請求訪問某個資源時, CDN會根據(jù)用戶的地理位置和網(wǎng)絡(luò)狀況,自動選擇離用戶最近的服務(wù)器來響應(yīng)請求 。如果該服務(wù)器上已經(jīng)緩存了

    2024年02月03日
    瀏覽(97)
  • vue3+ts+vite 搭建uniapp項目(微信小程序)

    vue3+ts+vite 搭建uniapp項目(微信小程序)

    模板下載: uniapp 官網(wǎng)通過vue-cli 命令行創(chuàng)建uniapp,參考uni-app官網(wǎng),使用? npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project 下載模板; 安裝css預(yù)處理 sass: 項目終端輸入: yarn add node-sass@^4.0.0 sass-loader@^10.0.1 sass (模板沒有默認(rèn)安裝sass, 如果不安裝直接使用會報錯) ?安裝uni-ui組件

    2024年02月09日
    瀏覽(51)
  • vue3+vite+ts項目集成科大訊飛語音識別(項目搭建過程以及踩坑記錄)

    ?? 個人主頁: 不叫貓先生 ???♂? 作者簡介:前端領(lǐng)域新星創(chuàng)作者、阿里云專家博主,專注于前端各領(lǐng)域技術(shù),共同學(xué)習(xí)共同進步,一起加油呀! ??系列專欄:vue3從入門到精通、TypeScript從入門到實踐 ?? 資料領(lǐng)?。呵岸诉M階資料以及文中源碼可以找我免費領(lǐng)取 ?? 前端

    2023年04月09日
    瀏覽(41)
  • vue3+vite+ts項目搭建之后,vscode文件夾下紅色波浪線問題

    vue3+vite+ts項目搭建之后,vscode文件夾下紅色波浪線問題

    ????????搭建完vue3+vite+ts項目之后,用vscode打開項目,發(fā)現(xiàn) .vue 文件和 main.ts 文件夾下都有紅色破浪線(如下圖所示)。幾番周折終于解決了這個問題。 1. 解決.ts文件報錯 報錯原因:ts不識別.vue后綴的文件。 解決方式:創(chuàng)建腳手架的時候,項目的根目錄下會生成一個en

    2024年02月04日
    瀏覽(19)
  • vite+vue3+ts+eslint+prettier+husky+lint-stated 項目搭建

    項目搭建 創(chuàng)建初始項目 Node.js 版本 14.18+,16+ npm create vite@latest my-vue-app --template vue-ts 添加eslint eslint 初始化 npm init @eslint/config eslint初始化腳本,按自己的要求選擇相應(yīng)的eslint 配置,以下是我選擇的配置項 ? How would you like to use ESLint? · style ? What type of modules does your project

    2024年02月08日
    瀏覽(29)
  • 從0開始搭建一個vue3+vite+ts+pinia+element-plus的項目

    從0開始搭建一個vue3+vite+ts+pinia+element-plus的項目

    前言:vue3+ts+vite大家已經(jīng)都開始用了,最近也在學(xué)習(xí),基本上是零基礎(chǔ)開始ts的學(xué)習(xí),很多語法知識是邊寫邊查,沒有系統(tǒng)的學(xué)習(xí)ts。此處展示從零開始,搭建的一個框架,方便拿來即用! 其中框架選擇vue,語言選擇typeScript 項目啟動成功以后如下所示: 為了方便日常工作中

    2024年02月06日
    瀏覽(28)
  • uniapp+vue3+vite+ts搭建項目引入uni-ui和uviewPlus組件庫

    一、創(chuàng)建項目架構(gòu) 首先使用官方提供的腳手架創(chuàng)建一個項目 在這里插入代碼片 ,這里我創(chuàng)建的 vue3 + vite + ts 的項目: (如命令行創(chuàng)建失敗,請直接訪問 gitee下載模板) 二、下載依賴 啟動 三、下載安裝包 引入uni-ui src/package.json 文件配置easycom模式 引入uview-plus main.ts配置 u

    2024年02月13日
    瀏覽(16)
  • Vue3 - 解決 build / dev 打包運行時突然出現(xiàn)一堆 ts 相關(guān)的報錯,強制關(guān)閉整個項目的 ts 代碼語法校驗和驗證(webpack / vite 均可)

    無論您是 vite 還是 webpack,都可以 100% 去掉運行或打包時的 ts 語法驗證。 本文 實現(xiàn)了在 vue3 + ts 開發(fā)中,關(guān)閉運行、打包部署命令時出現(xiàn)的各種 ts 校驗報錯,去掉對 ts 的驗證, 有些朋友對 ts 不是很了解(所以在寫代碼時沒注意一些語法),導(dǎo)致最終 build 打包時出現(xiàn)了很多

    2024年02月11日
    瀏覽(140)
  • electron+vue3全家桶+vite項目搭建【24】設(shè)置應(yīng)用圖標(biāo),打包文件的圖標(biāo)

    electron+vue3全家桶+vite項目搭建【24】設(shè)置應(yīng)用圖標(biāo),打包文件的圖標(biāo)

    demo項目地址 在electron中,我們可以通過electron-builder的配置文件來設(shè)置打包后的應(yīng)用圖標(biāo) 因為mac環(huán)境下的圖標(biāo)需要特殊格式,這里我們可以利用electron-icon-builder進行配置 1.引入相關(guān)依賴 加入安裝過程中卡在了 phantomjs-2.1.1-windows.zip的下載,可以直接去github上下載 這里我也放一

    2024年02月17日
    瀏覽(123)
  • Vue3項目(Vite+TS)使用Web Serial Api全記錄

    Vue3項目(Vite+TS)使用Web Serial Api全記錄

    之前寫了一個vue+django的一個通過串口控制的上位機系統(tǒng)。但是實際生產(chǎn)中,不如部署到服務(wù)器上,這樣可以更好的節(jié)約成本。但是這樣就需要弄一個客戶端來控制處理串口信息。那我就在想能不能通過網(wǎng)頁直接拿到客戶端的串口信息。所以問了萬能的chatgpt,得到了以下答案

    2024年02月02日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包