Vue 之 vue.config.js 配置文件

"use strict";
// nodejs 内置模块 (path 模块用于处理 文件 和 目录(文件夹) 的路径)
const path = require("path");
const defaultSettings = require("./src/settings.js");
// 转换编码格式
const EncodingPlugin = require("webpack-encoding-plugin");
const { tranceDeprecation } = require("process");

// const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV)
// const resolve = dir => path.join(__dirname, dir)
function resolve(dir) {
  return path.join(__dirname, dir);
}

const name = defaultSettings.title || "vue Element Admin"; // page title

// If your port is set to 80,   // 如果您的端口号设置为 80
// use administrator privileges to execute the command line.    // 使用管理员权限执行命令行
// For example, Mac: sudo npm run   // 例如 : Mac:sudo npm run
// You can change the port by the following method:   // 可以通过以下方法修改端口
// port = 9527 npm run dev OR npm run dev --port = 9527
// const port = process.env.port || process.env.npm_config_port || 9527   // dev port

// All configuration item explanations can be find in https://cli.vuejs.org/config/   // 所有配置项说明可在  中找到
module.exports = {
  /**
   * You will need to set publicPath if you plan to deploy your site under a sub path,
   * for example GitHub Pages. If you plan to deploy your site to https://foo.github.io/bar/,
   * then publicPath should be set to "/bar/".
   * In most cases please use '/' !!!
   * Detail: https://cli.vuejs.org/config/#publicpath
   */
  /**
   * 如果计划在子路径下部署站点,则需要设置 publicPath,
   * 例如 GitHub 页面。如果您计划将站点部署到 https://foo.github.io/bar/,
   * 然后 publicPath 应该设置为 “/bar/”。
   * 在大多数情况下,请使用 “/” !!!
   * 详情:https://cli.vuejs.org/config/#publicpath
   */
  // publicPath: process.env.NODE_ENV === "production" ? "/site/vue-demo" : "/",   // 公共路径 默认为 '/' , 建议使用 './' 相对路径
  publicPath: "/",
  // publicPath: "./",
  indexPath: "index.html", // 相对于打包路径 index.html 的路径(输出 html 文件名)
  // outputDir: process.env.outputDir || 'dist', // 'dist' , 生产环境构建文件的打包输出目录
  outputDir: "dist",
  assetsDir: "static", // 相对于 outputDir 的静态资源文件输出目录 (js,css,img,fonts)目录
  lintOnSave: process.env.NODE_ENV === "development", // 是否在开发环境下通过 eslint-loader 在每次保存时 lint 代码
  // lintOnSave: false, // 取消 lint 语法检测 , 此处可不配置
  runtimeCompiler: true, // 是否使用包含运行时编译器的 Vue 构建版本
  productionSourceMap: false, // 取消 .map 文件的打包 , 加快打包速度
  // productionSourceMap: !IS_PROD,  // 生产环境的 source map
  parallel: require("os").cpus().length > 1, // 是否为 Babel 或 TypeScript 使用 thread-loader ; 该选项在系统的 CPU 有多于一个内核时自动启用 , 仅作用于生产构建
  pwa: {}, // 向 PWA 插件传递选项
  devServer: {
    // 本地服务器配置 (npm run serve)
    // host: 'localhost',  // 域名
    port: 8080, // 端口号
    // port: port,
    progress: true, // 打包进度
    https: false, // 是否开启 https   https:{type:Boolean}
    open: true, // 配置自动启动浏览器
    quiet: true, // 除了一些基本的启动信息外 , 其他的内容都不要显示
    hotOnly: true, // 热更新
    overlay: {
      // 让浏览器 overlay 同时显示警告和错误
      warnings: false,
      errors: true,
    },
    // 服务器代理 => 解决开发环境跨域问题
    // proxy: 'http://localhost:8080', // 配置跨域处理 , 只有一个代理

    proxy: {
      "/xhl": {
        target: "http://12.34.567.890:8089/",
        changOrigin: true,
        pathRewrite: {
          "/xhl": "xhl",
        },
      },
    },
    // proxy: {
    //   // 配置多个跨域
    //   // 一旦 devServe 服务器接收到 开头的请求 , 就会把请求转发到另一个服务器
    //   [process.env.VUE_APP_BASE_API]: {
    //     //  DNS 服务器 . . . . . : 12.34.567.8
    //     // target: `http://12.34.567.890:8080`,
    //     // target: `http://00.11.222.33:9080`,
    //     target: 'http://12.34.567.890:8089/',
    //     changOrigin: true,  // 配置跨域
    //     // 发送请求时 , 请求路径重写 : 将 去除
    //     pathRewrite: {
    //       ['^test' + process.env.VUE_APP_BASE_API]: ''
    //     }
    //   }
    // },
    before: require("./mock/mock-server.js"),
  },

  // webpack 配置
  configureWebpack: {
    // provide the app's title in webpack's name field,  // 在网页包的名称字段中提供应用程序的标题,
    // so that it can be accessed in index.html to inject the correct title. // 这样就可以在索引中访问它。html 注入正确的标题。
    name: name,
    // 解析模块的规则
    resolve: {
      // 配置解析模块路径别名 : 优点 简写路径 , 缺点 路径没有提示
      alias: {
        // 定义一个 @ 变量 , 可在 import 引入时使用
        "@": resolve("src"),
      },
    },
  },
  // webpack 配置
  chainWebpack(config) {
    // it can improve the speed of the first screen, it is recommended to turn on preload
    // 它可以提高第一屏的速度,建议打开预加载
    config.resolve.symlinks(true); // 修复热更新失效
    config.plugins.delete("preload"); // TODO: need test

    // when there are many pages, it will cause too many meaningless requests // 当页面太多时,会导致太多无意义的请求
    config.plugins.delete("prefetch"); // TODO: need test

    /* utf-8 编码 转为 BGK 编码 (公司后台环境可能会是 GBK 编码) */
    plugins: [
      new EncodingPlugin({
        encoding: "GBK",
      }),
    ];

    // set preserveWhitespace
    config.module
      .rule("vue")
      .use("vue-loader")
      .loader("vue-loader")
      .tap((options) => {
        options.compilerOptions.preserveWhitespace = true;
        return options;
      })
      .end();

    config
      // https://webpack.js.org/configuration/devtool/#development
      .when(process.env.NODE_ENV === "development", (config) =>
        config.devtool("cheap-source-map")
      );

    config.plugin("preload").tap(() => [
      {
        rel: "preload",
        // to ignore runtime.js
        // https://github.com/vuejs/vue-cli/blob/dev/packages/@vue/cli-service/lib/config/app.js#L171
        fileBlacklist: [/\.map$/, /hot-update\.js$/, /runtime\..*\.js$/],
        include: "initial",
      },
    ]);

    // set svg-sprite-loader
    config.module.rule("svg").exclude.add(resolve("src/icons")).end();
    config.module
      .rule("icons")
      .test(/\.svg$/)
      .include.add(resolve("src/icons"))
      .end()
      .use("svg-sprite-loader")
      .loader("svg-sprite-loader")
      .options({
        symbolId: "icon-[name]",
      })
      .end();

    config.when(process.env.NODE_ENV !== "development", (config) => {
      config
        .plugin("ScriptExtHtmlWebpackPlugin")
        .after("html")
        .use("script-ext-html-webpack-plugin", [
          {
            // `runtime` must same as runtimeChunk name. default is `runtime` // “runtime” 必须与 runtimeChunk 名称相同。默认值为“运行时”`
            inline: /runtime\..*\.js$/,
          },
        ])
        .end();
      config.optimization.splitChunks({
        chunks: "all",
        cacheGroups: {
          libs: {
            name: "chunk-libs",
            test: /[\\/]node_modules[\\/]/,
            priority: 10,
            chunks: "initial", // only package third parties that are initially dependent // 仅限于最初依赖的第三方
          },
          elementUI: {
            name: "chunk-elementUI", // split elementUI into a single package // 将 elementUI 拆分为一个包
            priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app // 重量需要大于libs和app,否则将打包到libs或app中
            test: /[\\/]node_modules[\\/]_?element-ui(.*)/, // in order to adapt to cnpm // 为了适应 cnpm
          },
          commons: {
            name: "chunk-commons",
            test: resolve("src/components"), // can customize your rules // 你可以自定义你的规则
            minChunks: 3, //  minimum common number // 最小公共数
            priority: 5,
            reuseExistingChunk: true,
          },
        },
      });
      // https:// webpack.js.org/configuration/optimization/#optimizationruntimechunk
      config.optimization.runtimeChunk("single");
    });
  },
};

Vue 之 vue.config.js 配置文件_第1张图片

你可能感兴趣的:(前端,前端)