'use strict' const path = require('path') function resolve(dir) { return path.join(__dirname, dir) } const name = '杰安易购商城' // page title const port = 9000 // dev port const externals = { vue: 'Vue', 'vue-router': 'VueRouter', vuex: 'Vuex', vant: 'vant', axios: 'axios' } // cdn const cdn = { // 开发环境 dev: { css: [], js: [ // 'https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.min.js', 'https://cdn.bootcdn.net/ajax/libs/vue-router/3.0.6/vue-router.min.js', 'https://cdn.bootcdn.net/ajax/libs/axios/0.18.0/axios.min.js', 'https://cdn.bootcdn.net/ajax/libs/vuex/3.1.1/vuex.min.js', 'https://cdn.bootcdn.net/ajax/libs/crypto-js/3.1.9/crypto-js.min.js', ] }, // 生产环境 build: { css: [], // 'https://cdn.jsdelivr.net/npm/vant@beta/lib/index.css' js: [ 'js/vue.min.js', 'js/vue-router.min.js', "js/axios.min.js", 'js/vuex.min.js', 'js/crypto-js.min.js', 'js/vant.min.js', // 'https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.min.js', // 'https://cdn.bootcdn.net/ajax/libs/vue-router/3.0.6/vue-router.min.js', // 'https://cdn.bootcdn.net/ajax/libs/axios/0.18.0/axios.min.js', // 'https://cdn.bootcdn.net/ajax/libs/vuex/3.1.1/vuex.min.js', // 'https://cdn.bootcdn.net/ajax/libs/crypto-js/3.1.9/crypto-js.min.js', // 'https://cdn.jsdelivr.net/npm/vant@beta/lib/vant.min.js' ] // css: ['https://cdn.jsdelivr.net/npm/vant@beta/lib/index.css'], // js: [ // 'https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.10/vue.min.js', // 'https://cdnjs.cloudflare.com/ajax/libs/vue-router/3.0.6/vue-router.min.js', // 'https://cdnjs.cloudflare.com/ajax/libs/axios/0.18.0/axios.min.js', // 'https://cdnjs.cloudflare.com/ajax/libs/vuex/3.1.1/vuex.min.js', // 'https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.min.js', // 'https://cdn.jsdelivr.net/npm/vant@beta/lib/vant.min.js' // ] } } module.exports = { publicPath: './', // router hash 模式使用 // publicPath: process.env.NODE_ENV === 'development' ? '/' : '/app/', //router history模式使用 需要区分生产环境和开发环境,不然build会报错 outputDir: 'dist', assetsDir: 'static', lintOnSave: process.env.NODE_ENV === 'development', productionSourceMap: false, devServer: { proxy: { // '/api': { // target: 'http://jiean.demo.ximengnaikang.com/api/', //对应自己的接口 // changeOrigin: true, // ws: true, // pathRewrite: { // '^/api': '' // } // } } }, css: { loaderOptions: { less: { // 若使用 less-loader@5,请移除 lessOptions 这一级,直接配置选项。 lessOptions: { modifyVars: { // 直接覆盖变量 blue: '#EF4353', red: '#EF4353', 'nav-bar-icon-color': '#010101', 'nav-bar-text-color': '#010101' } } } } }, devServer: { port: port, open: false, overlay: { warnings: false, errors: true } }, configureWebpack: config => { // 为生产环境修改配置... if (process.env.NODE_ENV === 'production') { // externals里的模块不打包 Object.assign(config, { name: name, externals: externals }) } // 为开发环境修改配置... // if (process.env.NODE_ENV === 'development') { // } }, chainWebpack(config) { config.plugins.delete('preload') // TODO: need test config.plugins.delete('prefetch') // TODO: need test // alias config.resolve.alias .set('@', resolve('src')) .set('assets', resolve('src/assets')) .set('api', resolve('src/api')) .set('views', resolve('src/views')) .set('components', resolve('src/components')) /** * 添加CDN参数到htmlWebpackPlugin配置中, 详见public/index.html 修改 */ config.plugin('html').tap(args => { if (process.env.NODE_ENV === 'production') { args[0].cdn = cdn.build } if (process.env.NODE_ENV === 'development') { args[0].cdn = cdn.dev } return args }) // 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.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` inline: /runtime\..*\.js$/ } ]) .end() config.optimization.splitChunks({ chunks: 'all', cacheGroups: { commons: { name: 'chunk-commons', test: resolve('src/components'), // can customize your rules minChunks: 3, // minimum common number priority: 5, reuseExistingChunk: true }, libs: { name: 'chunk-libs', chunks: 'initial', // only package third parties that are initially dependent test: /[\\/]node_modules[\\/]/, priority: 10 } } }) config.optimization.runtimeChunk('single') }) } }