如何用ts搭建一个vue3通用项目底座 | 第三篇:vite配置

前言

接下来进入项目搭建的重点部分:Vite配置。
本篇内容可能会有些多,耐心看完会有很多收获。

1、在根目录下新建一个build文件夹

虽然vue从很早就使用vue.config.js或者vite.config.ts来进行打包配置,但在webpack时期,似乎是用build文件夹来进行打包配置的,所以这里也使用build文件夹。
在这里插入图片描述
先看一下需要进行的打包配置,后面我会逐个文件的解释。

2、vite配置

先把vite.config.ts文件放出来,后面再一项一项解析

// vite.config.ts
import {
    ConfigEnv, loadEnv, UserConfig } from 'vite';
import {
    resolve } from 'path';

import pkg from './package.json';
import dayjs from 'dayjs';

import {
    exclude, include } from './build/optimize';
import {
    createProxy } from './build/vite/proxy';
import {
    wrapperEnv } from './build/utils';
import {
    createVitePlugins } from './build/vite/plugins';
import {
    OUTPUT_DIR } from './build/constant';
import {
    generateModifyVars } from './build/generate/generateModifyVars';

function pathResolve(dir: string) {
   
  return resolve(process.cwd(), '.', dir);
}

const {
    dependencies, devDependencies, name, version } = pkg;
const __APP_INFO__ = {
   
  pkg: {
    dependencies, devDependencies, name, version },
  // lastBuildTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
  lastBuildTime: dayjs().unix(),
};

export default ({
    command, mode }: ConfigEnv): UserConfig => {
   
  const root = process.cwd();

  const env = loadEnv(mode, root);

  const viteEnv = wrapperEnv(env);

  const {
    VITE_PORT, VITE_PUBLIC_PATH, VITE_PROXY, VITE_DROP_CONSOLE } = viteEnv;

  const isBuild = command === 'build';

  return {
   
    base: VITE_PUBLIC_PATH,
    root,
    resolve: {
   
      alias: [
        // // 避免vue-i18n警告
        // {
   
        //   find: 'vue-i18n',
        //   replacement: 'vue-i18n/dist/vue-i18n.cjs.js',
        // },
        // /@/xxxx => src/xxxx
        {
   
          find: /\/@\//,
          replacement: pathResolve('src') + '/',
        },
        // /#/xxxx => types/xxxx
        {
   
          find: /\/#\//,
          replacement: pathResolve('types') + '/',
        },
      ],
    },
    server: {
   
      // 监听所有本地IP
      host: true,
      port: VITE_PORT,
      // 从.env加载代理配置
      proxy: createProxy(VITE_PROXY),
    },
    esbuild: {
   
      // 从.env加载no_console
      drop: VITE_DROP_CONSOLE ? ['console', 'debugger'] : [],
    },
    build: {
   
      sourcemap: true,
      // 兼容原生ESM的浏览器
      target: 'es2015',
      // 兼容移动端css样式
      cssTarget: 'chrome80',
      // 生成打包文件名称 dist
      outDir: OUTPUT_DIR,
      // 不报告压缩大小
      reportCompressedSize: false,
      // 消除打包大小超过500kb警告
      chunkSizeWarningLimit: 4000,
      rollupOptions: {
   
        output: {
   
          // 用于从入口点创建的块的打包输出格式[name]表示文件名,[hash]表示该文件内容hash值
          entryFileNames: 'js/[name].[hash].js',
          // 用于命名代码拆分时创建的共享块的输出命名
          chunkFileNames: 'js/[name].[hash].js',
          // 用于输出静态资源的命名,[ext]表示文件扩展名
          assetFileNames: (assetInfo: any) => {
   
            const info = assetInfo.name.split('.');
            let extType = info[info.length - 1];
            if (/\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/i.test(assetInfo.name)) {
   
              extType = 'media';
            } else if (/\.(png|jpe?g|gif|svg)(\?.*)?$/.test(assetInfo.name)) {
   
              extType = 'img';
            } else if (/\.(woff2?|eot|ttf|otf)(\?.*)?$/i.test(assetInfo.name)) {
   
              extType = 'fonts';
            }
            return `${
     extType}/[name].[hash].[ext]`;
          },
        },
        // 这一部分等后续nginx熟练了再启用
        // output: {
   
        //   // 最小化拆分包
        //   manualChunks: (id) => {
   
        //     if (id.includes('node_modules')) {
   
        //       return id.toString().split('node_modules/')[1].split('/')[0].toString();
        //     }
        //   },
        //   // 用于从入口点创建的块的打包输出格式[name]表示文件名,[hash]表示该文件内容hash值
        //   entryFileNames: `${OUTPUT_DIR}/js/[name].[hash].js`,
        //   // 用于命名代码拆分时创建的共享块的输出命名
        //   chunkFileNames: `${OUTPUT_DIR}/js/[name].[hash].js`,
        //   // 用于输出静态资源的命名,[ext]表示文件扩展名
        //   assetFileNames: `${OUTPUT_DIR}/[ext]/[name].[hash].[ext]`,
        // },
      },
    },
    define: {
   
      // 定义全局变量替换方式
      __APP_INFO__: JSON.stringify(__APP_INFO__),
    },
    css: {
   
      preprocessorOptions: {
   
        scss: {
   
          additionalData: generateModifyVars(),
        },
      },
    },
    // 插件
    plugins: createVitePlugins(viteEnv, isBuild),
    // 依赖预构建配置项
    optimizeDeps: {
   
      include,
      exclude,
    },
  };
};

全部粘贴过去以后会有很多爆红,没事先都注释掉,后面逐项放开。

// vite.config.ts
// import { ConfigEnv, loadEnv, UserConfig } from 'vite';
import {
    UserConfig } from 'vite';
import {
    resolve } from 'path';

import pkg from './package.json';
// import dayjs from 'dayjs';

// import { exclude, include } from './build/optimize';
// import { createProxy } from './build/vite/proxy';
// import { wrapperEnv } from './build/utils';
// import { createVitePlugins } from './build/vite/plugins';
// import { OUTPUT_DIR } from './build/constant';
// import { generateModifyVars } from './build/generate/generateModifyVars';

function pathResolve(dir: string) {
   
  return resolve(process.cwd(), '.', dir);
}

const {
    dependencies, devDependencies, name, version } = pkg;
const __APP_INFO__ = {
   
  pkg: {
    dependencies, devDependencies, name, version },
  // lastBuildTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
  // lastBuildTime: dayjs().unix(),
};

export default (): UserConfig => {
   
  // export default ({ command, mode }: ConfigEnv): UserConfig => {
   
  const root = process.cwd();

  // const env = loadEnv(mode, root);

  // const viteEnv = wrapperEnv(env);

  // const { VITE_PORT, VITE_PUBLIC_PATH, VITE_PROXY, VITE_DROP_CONSOLE } = viteEnv;

  // const isBuild = command === 'build';

  return {
   
    // base: VITE_PUBLIC_PATH,
    root,
    resolve: {
   
      alias: [
        // 避免vue-i18n警告
        {
   
          find: 'vue-i18n',
          replacement: 'vue-i18n/dist/vue-i18n.cjs.js',
        },
        // /@/xxxx => src/xxxx
        {
   
          find: /\/@\//,
          replacement: pathResolve('src') + '/',
        },
        // /#/xxxx => types/xxxx
        {
   
          find: /\/#\//,
          replacement: pathResolve('types') + '/',
        },
      ],
    },
    server: {
   
      // 监听所有本地IP
      host: true,
      // port: VITE_PORT,
      // 从.env加载代理配置
      // proxy: createProxy(VITE_PROXY),
    },
    esbuild: {
   
      // 从.env加载no_console
      // drop: VITE_DROP_CONSOLE ? ['console', 'debugger'] : [],
    },
    build: {
   
      sourcemap: true,
      // 兼容原生ESM的浏览器
      target: 'es2015',
      // 兼容移动端css样式
      cssTarget: 'chrome80',
      // 生成打包文件名称 dist
      // outDir: OUTPUT_DIR,
      // 不报告压缩大小
      reportCompressedSize: false,
      // 消除打包大小超过500kb警告
      chunkSizeWarningLimit: 4000,
      rollupOptions: {
   
        output: {
   
          // 用于从入口点创建的块的打包输出格式[name]表示文件名,[hash]表示该文件内容hash值
          entryFileNames: 'js/[name].[hash].js',
          // 用于命名代码拆分时创建的共享块的输出命名
          chunkFileNames: 'js/[name].[hash].js',
          // 用于输出静态资源的命名,[ext]表示文件扩展名
          assetFileNames: (assetInfo: any) =><
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值