"use strict"; const path = require("path"); const { HashedModuleIdsPlugin } = require("webpack"); // const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin; const resolve = dir => path.join(__dirname, dir); // page title const name = "vue mobile template"; const IS_PROD = ["production", "prod"].includes(process.env.NODE_ENV); // externals const externals = { AMap: "window.AMap", vue: "Vue", "vue-router": "VueRouter", vuex: "Vuex", axios: "axios" // 'vue-ydui': 'ydui', // 'mint-ui': 'MINT' }; // CDN外链,会插入到index.html中 const cdn = { // 开发环境 dev: { // '/static/app/mint-ui.css', '/static/app/ydui.px.css', css: ["/static/app/ydui.base.css", "/static/app/swiper.min.css","/static/app/theme/theme.css"], js: [ // '/static/app/TcPlayer-2.3.2.js', // 'https://player.polyv.net/livesdk/polyv-live.min.js', // 'https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js', "/static/app/wxLogin.js", "/static/app/app-min.js", //录音 "/static/app/recorder-core.js", "/static/app/gov_province_city_area_id.js", "/static/app/swiper.min.js", // "/static/app/vue.js", "/static/app/vue.min-2.6.14.js", "/static/app/vue-awesome-swiper.js", // '/static/app/vue-router.min.js', "/static/app/vuex.min.js", "/static/app/axios.min.js", // '/static/app/ydui.px.js', // '/static/app/mint-ui.js', 去掉mint "/static/app/YdbOnline.js", "/static/app/apps.js", "/static/app/fixifmheight.js", // "/static/app/jweixin-1.6.0.js", // "/static/app/jwxwork-1.0.0.js", "/static/app/decode_common.js", "/static/app/shopConfig.js" // '/static/app/core.js', // '/static/app/enc-base64.js', // '/static/app/cipher-core.js', // '/static/app/aes.js', // '/static/app/md5.js', // '/static/app/tinymce4.7.5/tinymce.min.js' ] }, // 生产环境 build: { // './static/app/mint-ui.css','./static/app/ydui.px.css', css: ["./static/app/ydui.base.css", "./static/app/swiper.min.css","./static/app/theme/theme.css"], js: [ // './static/app/TcPlayer-2.3.2.js', // 'https://player.polyv.net/livesdk/polyv-live.min.js', // 'https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js', "./static/app/wxLogin.js", "./static/app/app-min.js", //录音 "./static/app/recorder-core.js", "./static/gov_province_city_area_id.js", "./static/app/swiper.min.js", "./static/app/vue.min-2.6.14.js", "./static/app/vue-awesome-swiper.js", "./static/app/vue-router.min.js", "./static/app/vuex.min.js", "./static/app/axios.min.js", // './static/app/ydui.px.js', // './static/app/mint-ui.js', "./static/app/YdbOnline.js", "./static/app/apps.js", "./static/app/fixifmheight.js", // "./static/app/jweixin-1.6.0.js", // "./static/app/jwxwork-1.0.0.js", "./static/app/decode_common.js", "./shopConfig.js" // './static/app/core.js', // './static/app/enc-base64.js', // './static/app/cipher-core.js', // './static/app/aes.js', // './static/app/md5.js', // './static/app/tinymce4.7.5/tinymce.min.js' ] } }; module.exports = { publicPath: process.env.NODE_ENV === "production" ? "/addons/yun_shop/" : "/", // 署应用包时的基本 URL。 vue-router hash 模式使用 // publicPath: '/app/', //署应用包时的基本 URL。 vue-router history模式使用 outputDir: process.env.VUE_APP_ENV === "production" ? "../yz-front-dist" : "./dist" , // 生产环境构建文件的目录 assetsDir: process.env.NODE_ENV === "production" ? "./static/app" : "static", // outputDir的静态资源(js、css、img、fonts)目录 // lintOnSave: !IS_PROD, productionSourceMap: false, // 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。 devServer: { host: "localhost", port: 8081, // 端口 open: false, // 启动后打开浏览器 overlay: { // 当出现编译器错误或警告时,在浏览器中显示全屏覆盖层 warnings: false, errors: true }, proxy: { "/addons/yun_shop/api.php": { target: "https://testbzt.cdlfjy.com/", //目标接口域名bztang.cdlfjy.com testbzt.cdlfjy.com changeOrigin: true, //是否跨域 secure: false // pathRewrite: { // '^/api': '/' //重写接口 // } } } }, css: { extract: false, sourceMap: false, loaderOptions: { scss: { // 向全局sass样式传入共享的全局变量, $src可以配置图片cdn前缀 // 详情: https://cli.vuejs.org/guide/css.html#passing-options-to-pre-processor-loaders // prependData: ` // // $cdn: "${defaultSettings.$cdn}"; // ` } } }, transpileDependencies: IS_PROD ? ["*"] : [], configureWebpack: config => { const plugins = []; config.name = name; // 为生产环境修改配置... if (IS_PROD) { // externals config.externals = externals; config.entry.app = ["babel-polyfill", "./src/main.js"]; plugins.push(new HashedModuleIdsPlugin()); } else { delete externals["vue-router"]; config.externals = externals; } return { plugins }; }, chainWebpack: config => { config.plugins.delete("preload"); config.plugins.delete("prefetch"); // 别名 alias config.resolve.alias .set("@", resolve("src")) .set("src", resolve("src")) .set("assets", resolve("src/assets")) .set("views", resolve("./src/views")) .set("components", resolve("src/components")) .set("utils", resolve("./src/utils")); /** * 添加CDN参数到htmlWebpackPlugin配置中 */ config.plugin("html").tap(args => { if (IS_PROD) { args[0].cdn = cdn.build; } else { args[0].cdn = cdn.dev; } return args; }); /** * 设置保留空格 */ config.module .rule("vue") .use("vue-loader") .loader("vue-loader") .tap(options => { options.compilerOptions.preserveWhitespace = true; return options; }) .end(); /** * 打包分析 */ // if (IS_PROD) { // config.plugin('webpack-report').use(BundleAnalyzerPlugin, [ // { // analyzerMode: 'static' // } // ]) // } config // https://webpack.js.org/configuration/devtool/#development .when(!IS_PROD, config => config.devtool("cheap-source-map")); config.when(IS_PROD, config => { config .plugin("ScriptExtHtmlWebpackPlugin") .after("html") .use("script-ext-html-webpack-plugin", [ { // 将 runtime 作为内联引入不单独存在 inline: /runtime\..*\.js$/ } ]) .end(); config.optimization.splitChunks({ chunks: "all", cacheGroups: { // cacheGroups 下可以可以配置多个组,每个组根据test设置条件,符合test条件的模块 commons: { name: "chunk-commons", test: resolve("src/components"), minChunks: 3, // 被至少用三次以上打包分离 priority: 5, // 优先级 reuseExistingChunk: true // 表示是否使用已有的 chunk,如果为 true 则表示如果当前的 chunk 包含的模块已经被抽取出去了,那么将不会重新生成新的。 }, node_vendors: { name: "chunk-libs", chunks: "initial", // 只打包初始时依赖的第三方 test: /[\\/]node_modules[\\/]/, priority: 10 }, styles: { name: "styles", test: /\.(sa|sc|c)ss$/, chunks: "all", enforce: true }, vantUI: { name: "chunk-vantUI", // 单独将 vantUI 拆包 priority: 20, // 数字大权重到,满足多个 cacheGroups 的条件时候分到权重高的 test: /[\\/]node_modules[\\/]_?vant(.*)/ } } }); config.optimization.runtimeChunk("single"); }); } };