"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");
});
},
};