image.png
    image.png
    image.png

    例如:
    config文件为: webpack.common.js

    1. // 可以通过传入env来做一些判断,是否是生产环境,或开发环境
    2. module.exports = env => {
    3. console.log(env);
    4. let common = {
    5. entry: {
    6. app: './app.js'
    7. },
    8. output: {
    9. path: __dirname+"/src/dist",
    10. filename: './[name].bundle.js'
    11. },
    12. module: {
    13. rules: [
    14. ]
    15. }
    16. };
    17. return common;
    18. }

    运行:
    webpack —config webpack.common.js —env production

    文件目录结构:
    image.png
    这个项目里有两个环境,一个production环境,一个development环境。

    webpack.common.js
    注意css文件的名字。需要安装包 webpack-merge。
    下面是以雪碧图为例,生产模式下需要雪碧图,而开发模式下不需要雪碧图,定义了一个数组 postPlugins,然后根据环境来设置具体需要还是不需要。

    1. const webpack=require('webpack');
    2. const extractTextCss=require('extract-text-webpack-plugin');
    3. const dev=require('./webpack.dev.js');
    4. const pro=require('./webpack.pro.js');
    5. const merge=require('webpack-merge');
    6. module.exports=env=>{
    7. var postPlugins=[require('autoprefixer')(), require('postcss-cssnext')()];
    8. postPlugins.concat(env==='production'?[require('postcss-sprites')({
    9. spritePath: 'dist/sprite',
    10. retina: true
    11. })]:[])
    12. //配置对象
    13. var common={
    14. entry:'./app.js',
    15. output:{
    16. filename:'bundle.js'
    17. },
    18. module:{
    19. rules: [
    20. //js处理
    21. {
    22. test:/\.js$/,
    23. use:
    24. {
    25. loader:'babel-loader',
    26. }
    27. },
    28. //css处理
    29. {
    30. test:/\.less$/,
    31. use:extractTextCss.extract({
    32. fallback:{
    33. loader:'style-loader',
    34. options:{
    35. //insertInto:"#mydiv",
    36. singleton:true,
    37. //transform:"./transform.js"
    38. }
    39. },
    40. use:[
    41. {
    42. loader:'css-loader',
    43. options:{
    44. modules:{
    45. localIdentName:'[path][name]_[local]_[hash:4]'
    46. }
    47. }
    48. },
    49. {
    50. loader:'postcss-loader',
    51. options:{
    52. ident:'postcss',
    53. plugins:postPlugins
    54. }
    55. },
    56. {
    57. loader:'less-loader'
    58. }
    59. ]
    60. })
    61. },
    62. ]
    63. },
    64. plugins:[
    65. //提取额外css文件
    66. new extractTextCss({
    67. filename:env==='production'?'app.bundle.css':'app.dev.css'
    68. })
    69. ]
    70. };
    71. //返回配置对象
    72. return merge(common,env==='production'?pro:dev);
    73. }

    webpack.dev.js:

    1. const webpack = require('webpack')
    2. module.exports={
    3. devtool: 'cheap-module-source-map',
    4. devServer: {
    5. port: 9001,
    6. overlay: true,
    7. hot: true,
    8. hotOnly: true,
    9. },
    10. plugins: [
    11. new webpack.HotModuleReplacementPlugin(),
    12. new webpack.NamedModulesPlugin(),
    13. ]
    14. }

    webpack.pro.js

    1. var webpack = require('webpack')
    2. var HtmlWebpackPlugin = require('html-webpack-plugin');
    3. module.exports={
    4. optimization: {
    5. minimize: false
    6. },
    7. plugins:[
    8. new HtmlWebpackPlugin({
    9. filename: 'index.html',
    10. template: './index.html',
    11. minify: {
    12. collapseWhitespace: true
    13. },
    14. inject:true,
    15. }),
    16. ]
    17. }

    package.json:

    1. "scripts": {
    2. "test": "echo \"Error: no test specified\" && exit 1",
    3. "build": "webpack --env production --config webpack.common.js",
    4. "dev": "webpack-dev-server --env development --config webpack.common.js"
    5. },

    webpack4中的环境区分:
    设置mode就可以区分了,如 运行 webpack —mode production。
    及时没有设置是否压缩,但是指定了mode为production,webpack会自动压缩打包文件。

    1. {
    2. mode: "production",
    3. entry:'./app.js',
    4. output:{
    5. filename:'bundle.js'
    6. }
    7. }