小生愛

    

      
            const glob = require('glob')
            const webpack = require('webpack')
            const path = require('path')
            // glob.sync 同步加载 返回一个文件名称列表
            const fileNames = ( function (obj = {}) {
              glob.sync('app/*.js').forEach(v => {
                let key = v.match(/([^/]+)\.js/img)
                obj[RegExp.$1] = `./${v}`
              })
              return obj
            } )()

            // 非webpack 自带插件 需要引入后使用
            const ExtractTextPlugin = require("extract-text-webpack-plugin")

            module.exports = {
              // context: 如果不通过path.resolve 配置入口访问路径 watch: true失效
              context: path.resolve('./'),

              entry: Object.assign(fileNames, {public: ['jquery', 'vue']}),

              output: {
                // filename: 编译的文件名 仅用于命名每个文件
                // [name]: 多入口形式 入口文件名替换这里的name 
                // [chunkhash: num]: 入口文件的hash值 用于修改后清空缓存
                // filename: '[name].[chunkhash:3].js',
                filename: 'js/[name].js',
                // 包存放的目录
                path: path.resolve('./build'),
                publicPath: 'http://localhost/'
              },

              module: {
                rules: [
                  {
                    // 这里必须要添加 $ 否则匹配时 可能匹配到别的代码 有可能报错
                    test: /\.(css)$/,
                    use: ExtractTextPlugin.extract({
                      // cnpm install postcss-smart-import precss autoprefixer --save-dev
                      // postcss-loader: (Autoprefixer 需要用这个插件)自动补全 CSS前缀
                      use: ['css-loader', 'postcss-loader']
                    })
                  },

                  {
                    test: /\.jsx?$/,
                    loader: 'babel-loader',
                    options: {
                      presets: ['es2015']
                    }
                  },

                  {
                    // 这里必须要添加 $ 否则匹配时 可能匹配到别的代码 有可能报错
                    test: /\.less$/,
                    use: ExtractTextPlugin.extract({
                      // postcss-loader: 自动补全 CSS前缀 sass必须在postcss-loader前面 less不需要
                      use: ['css-loader', 'less-loader', 'postcss-loader']
                    })
                  },

                  /**
                    **  建议 如果不需要使用 limit时 直接用file-loader 如果需要使用limit时 可以使用url-loader  
                    *  url-loader 如果失效 将自动调用 file-loader 加在url-loader上的参数会自动传到file-loader上
                                  所以url-loader file-loader必须都添加
                    *  url-loader: 只有一个limit=sum属性 可以将小于limit的图片转成base64输出
                    *  (以下的参数 都是file-name有的 url-loader失效时自动把参数传递到file-loader上)
                    *  name: 设置文件输出路径
                        [path]: 资源相对于 url-loader的context查询参数 或者 最外层的context路径 这个必须加 否则打包拷贝图片路径不对
                        [name]: 打包图片的每个图片的名字
                        outputPath: 打包图片输出路径 本例是放在app2下面 根据需要选择是否添加
                        publicPath: 当如果在output中添加了publicPath路径不符合要求时 可以给url-loader添加私有的publicPath 这个路径将
                                    自动替换CSS文件下引用图片的地址
        
                    *  js 中加载图片方法 (真实情况 应该很少碰到这种情况 图片都是后台返回CDN地址)
                           let imgSrc = require(图片相对地址)
                           img.src = imgSrc 
                           这样可以打包自动替换JS中 各种图片的路径 
                  */
                  {
                    test: /\.(png|jpg)$/,
                    loader: 'url-loader?limit=50&name=[path][name].[ext]&context=./&outputPath=app2/&publicPath=http://localhost/build/'
                  }
                  // {
                  //   test: /\.(png|jpg)$/,
                  //   loader: 'file-loader?name=[path][name].[ext]&context=./&outputPath=app2/&publicPath=http://localhost/build/'
                  // }
                ]
              },

              plugins: [
                new webpack.optimize.CommonsChunkPlugin({
                  // 公共模块名称 有多个 使用数组
                  // 匹配entry 入口文件名 相同的单独打包 其他模块统一抽取公共代码到commons.js中
                  // css文件默认打包到一个公共CSS里 common.css
                  // 公共文件也必须在在这里打包 否则公共文件会出现在其他文件里
                  names: ['commons', 'public']
                }),

                // ExtractTextPlugin 对每个入口 chunk 都生成对应的一个文件 
                // 所以当你配置多个入口 chunk时 你必须使用 [name] [id] [contenthash]
                new ExtractTextPlugin({
                  // filename: 提取后的css名称
                  //    [name]: chunk 的文件名
                  //    [contenthash: num]: 提取文件根据内容生成的哈
                  // * 路径相对于 output里的path
                  // filename: '../styles/[name].[contenthash:3].css'
                  filename: 'styles/[name].css'
                })
              ],
              
              watch: true
            }

            
            下载例子