vue-cli脚手架之webpack.prod.conf.js

webpack.prod.conf.js 生产环境配置文件:

‘use strict‘//js严格模式执行
const path = require(‘path‘)//这个模块是发布到NPM注册中心的NodeJS“路径”模块的精确副本
const utils = require(‘./utils‘)//utils.js文件
const webpack = require(‘webpack‘)//webpack模块
const config = require(‘../config‘)//config文件夹下的index.js  是不是很神奇?
const merge = require(‘webpack-merge‘)//合并数组、对象为一个新的对象的模块
const baseWebpackConfig = require(‘./webpack.base.conf‘)//webpack.base.conf.js
const CopyWebpackPlugin = require(‘copy-webpack-plugin‘)//拷贝文件和文件夹模块
const HtmlWebpackPlugin = require(‘html-webpack-plugin‘)//为html文件中引入的外部资源(比如script/link等)动态添加每次compile后的hash,保证文件名不重复的好处是防止引用缓存文件导致修改暂未生效;可生成创建html入口文件
const ExtractTextPlugin = require(‘extract-text-webpack-plugin‘)//抽离css样式,防止将样式打包到js中引起加载错乱
const OptimizeCSSPlugin = require(‘optimize-css-assets-webpack-plugin‘)//压缩css插件
const UglifyJsPlugin = require(‘uglifyjs-webpack-plugin‘)//压缩js代码。

const env = require(‘../config/prod.env‘)//设置为生产环境production
//merge方法合并模块对象,在这个文件里是将基础配置webpack.base.conf.js和生产环境配置合并
const webpackConfig = merge(baseWebpackConfig, {
  module: {//模块配置
    rules: utils.styleLoaders({//原版注释Generate loaders for standalone style files (outside of .vue)生成独立的样式文件装载机
      sourceMap: config.build.productionSourceMap,//设置sourceMap
      extract: true,//
      usePostCSS: true
    })
  },
  devtool: config.build.productionSourceMap ? config.build.devtool : false,//指定是否使用sourceMap
  output: {//指定输出
    path: config.build.assetsRoot,
    filename: utils.assetsPath(‘js/[name].[chunkhash].js‘),//编译输出的js文件存放在js文件夹下,命名规则添加hash计算
    /**
     * 打包require.ensure方法中引入的模块,如果该方法中没有引入任何模块则不会生成任何chunk块文件
     *
     * 比如在main.js文件中,require.ensure([],function(require){alert(11);}),这样不会打包块文件
     * 只有这样才会打包生成块文件require.ensure([],function(require){alert(11);require(‘./greeter‘)})
     * 或者这样require.ensure([‘./greeter‘],function(require){alert(11);})
     * chunk的hash值只有在require.ensure中引入的模块发生变化,hash值才会改变
     * 注意:对于不是在ensure方法中引入的模块,此属性不会生效,只能用CommonsChunkPlugin插件来提取
     */
    chunkFilename: utils.assetsPath(‘js/[id].[chunkhash].js‘)
  },
  plugins: [
    // http://vuejs.github.io/vue-loader/en/workflow/production.html
    new webpack.DefinePlugin({
      ‘process.env‘: env
    }),
    new UglifyJsPlugin({//压缩js代码的插件  具体可以去npm查一下这个插件怎么用以及能设置哪些参数
      uglifyOptions: {
        compress: {
          warnings: false
        }
      },
      sourceMap: config.build.productionSourceMap,//是否生成sourceMap
      parallel: true
    }),
    // extract css into its own file
    new ExtractTextPlugin({
      filename: utils.assetsPath(‘css/[name].[contenthash].css‘),
      // Setting the following option to `false` will not extract CSS from codesplit chunks.
      // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
      // It‘s currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it‘s `false`,
      // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
      allChunks: true,
    }),
    // Compress extracted CSS. We are using this plugin so that possible
    // duplicated CSS from different components can be deduped.
    new OptimizeCSSPlugin({
      cssProcessorOptions: config.build.productionSourceMap
        ? { safe: true, map: { inline: false } }
        : { safe: true }
    }),
    // generate dist index.html with correct asset hash for caching.
    // you can customize output by editing /index.html
    // see https://github.com/ampedandwired/html-webpack-plugin
    new HtmlWebpackPlugin({
      filename: config.build.index,
      template: ‘index.html‘,
      inject: true,
      minify: {
        removeComments: true,
        collapseWhitespace: true,
        removeAttributeQuotes: true
        // more options:
        // https://github.com/kangax/html-minifier#options-quick-reference
      },
      // necessary to consistently work with multiple chunks via CommonsChunkPlugin
      chunksSortMode: ‘dependency‘
    }),
    // keep module.id stable when vendor modules does not change
    new webpack.HashedModuleIdsPlugin(),
    // enable scope hoisting
    new webpack.optimize.ModuleConcatenationPlugin(),
    // split vendor js into its own file
    new webpack.optimize.CommonsChunkPlugin({
      name: ‘vendor‘,
      minChunks (module) {
        // any required modules inside node_modules are extracted to vendor
        return (
          module.resource &&
          /\.js$/.test(module.resource) &&
          module.resource.indexOf(
            path.join(__dirname, ‘../node_modules‘)
          ) === 0
        )
      }
    }),
    // extract webpack runtime and module manifest to its own file in order to
    // prevent vendor hash from being updated whenever app bundle is updated
    new webpack.optimize.CommonsChunkPlugin({
      name: ‘manifest‘,
      minChunks: Infinity
    }),
    // This instance extracts shared chunks from code splitted chunks and bundles them
    // in a separate chunk, similar to the vendor chunk
    // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
    new webpack.optimize.CommonsChunkPlugin({
      name: ‘app‘,
      async: ‘vendor-async‘,
      children: true,
      minChunks: 3
    }),

    // copy custom static assets
    new CopyWebpackPlugin([
      {
        from: path.resolve(__dirname, ‘../static‘),
        to: config.build.assetsSubDirectory,
        ignore: [‘.*‘]
      }
    ])
  ]//添加插件,是webpack功能更丰富
})
//是否允许压缩?
if (config.build.productionGzip) {
  const CompressionWebpackPlugin = require(‘compression-webpack-plugin‘)

  webpackConfig.plugins.push(
    new CompressionWebpackPlugin({
      asset: ‘[path].gz[query]‘,
      algorithm: ‘gzip‘,
      test: new RegExp(
        ‘\\.(‘ +
        config.build.productionGzipExtensions.join(‘|‘) +
        ‘)$‘
      ),
      threshold: 10240,
      minRatio: 0.8
    })
  )
}

if (config.build.bundleAnalyzerReport) {
  const BundleAnalyzerPlugin = require(‘webpack-bundle-analyzer‘).BundleAnalyzerPlugin
  webpackConfig.plugins.push(new BundleAnalyzerPlugin())
}

module.exports = webpackConfig

关于开发环境和生产环境的区别,引用一段官网长的解释。

开发环境(development)生产环境(production)构建目标差异很大。在开发环境中,我们需要具有强大的、具有实时重新加载(live reloading)或热模块替换(hot module replacement)能力的 source map 和 localhost server。而在生产环境中,我们的目标则转向于关注更小的 bundle,更轻量的 source map,以及更优化的资源,以改善加载时间。由于要遵循逻辑分离,我们通常建议为每个环境编写彼此独立的 webpack 配置。

虽然,以上我们将生产环境开发环境做了略微区分,但是,请注意,我们还是会遵循不重复原则(Don‘t repeat yourself - DRY),保留一个“通用”配置。为了将这些配置合并在一起,我们将使用一个名为 webpack-merge 的工具。

原文地址:https://www.cnblogs.com/hongdiandian/p/8319514.html

时间: 2024-10-10 01:17:41

vue-cli脚手架之webpack.prod.conf.js的相关文章

vue-cli脚手架npm相关文件说明-2、webpack.prod.conf.js

下面介绍webpack.prod.conf.js中相关配置代码和配置的说明,建议先查阅build/webpack.prod.conf.js /* * Webpack 生产环境配置文件,用于生产环境执行Build * 执行Build 主要是用Webpack执行这里的配置 * 建议先查阅webapck.base.conf.js ../config/index.js */ var path = require('path') var utils = require('./utils') // 下面是u

vue-cli脚手架build目录中的webpack.prod.conf.js配置文件

// 下面是引入nodejs的路径模块 var path = require('path') // 下面是utils工具配置文件,主要用来处理css类文件的loader var utils = require('./utils') // 下面引入webpack,来使用webpack内置插件 var webpack = require('webpack') // 下面是config目录下的index.js配置文件,主要用来定义了生产和开发环境的相关基础配置 var config = require

vue - webpack.prod.conf.js

描述:webpack打包项目时的配置文件. 命令:yarn run build 或 npm run build 打包后,生成的文件在dist文件夹下 打包后,要在服务器环境下运行!!! 关于怎样运行,请查看:https://www.cnblogs.com/cisum/p/9370163.html , 1 'use strict' 2 3 // 路径 4 const path = require('path') 5 // utils 6 const utils = require('./utils

webpack.prod.conf.js

var path = require('path')var utils = require('./utils')var webpack = require('webpack')var config = require('../config')var merge = require('webpack-merge')var baseWebpackConfig = require('./webpack.base.conf')var HtmlWebpackPlugin = require('html-w

vue - webpack.base.conf.js

描述:webapck基本配置文件. 为了给开发文件和打包文件(webpack.dev.conf.js|| webpack.prod.conf.js) 提供方便. 1 'use strict' 2 // 路径 3 const path = require('path') 4 // build/utils.js 5 const utils = require('./utils') 6 // config/index.js 7 const config = require('../config') 8

vue-cli脚手架build目录中的webpack.base.conf.js配置文件

此文章用来解释vue-cli脚手架build目录中的webpack.base.conf.js配置文件 此配置文件是vue开发环境的wepack相关配置文件,主要用来处理各种文件的配置 关于注释 当涉及到较复杂的解释我将通过标识的方式(如(1))将解释写到单独的注释模块,请自行查看 上代码 // 引入nodejs路径模块 var path = require('path') // 引入utils工具模块,具体查看我的博客关于utils的解释,utils主要用来处理css-loader和vue-st

vue模拟后台数据,请求本地数据的配置(旧版本dev-server.js,新版本webpack.dev.conf.js)

最近学习一个vue-cli的项目,需要与后台进行数据交互,这里使用本地json数据来模仿后台数据交互流程.然而发现build文件夹下没有dev-server.js文件了,因为新版本的vue-webpack-template 中已经去掉了dev-server.js,取而代之的是webpack.dev.conf.js文件,所以可以在webpack.dev.conf.js里配置本地访问. 对比旧版本的build文件夹,新版本的build下少了dev-server.js和dev-client.js 旧版

vue - webpack.dev.conf.js

1 'use strict' 2 3 // build/util.js 4 const utils = require('./utils') 5 // node_modules里面的webpack 6 const webpack = require('webpack') 7 // config/index.js 8 const config = require('../config') 9 // 对象合并 10 const merge = require('webpack-merge') 11

vue.cli脚手架初次使用图文教程

vue.cli脚手架初次使用图文教程 我之前的环境是安装了node.js, 我记得曾经好像安装过vue ,不过现在又要重新开始学习起来了.在youtube上看了一vue的相关教程,还是需要实操的. 好像安装过npm -v 发现已经安装了5.6.0 需要安装然后使用 cnpm 安装 vue-cli 和 webpack 安装代码:npm install -g vue-cli 一.生成项目 首先需要在命令行中进入到项目目录,然后输入: vue init webpack vue-testone p.p1