webpack多模块搭建

133 阅读2分钟

express 多模块

多模块入口文件为多个。

搭建多模块有几点要注意。

1.本地调试的热更新插件在入口文件中必须加入。

server.js入口文件添加热更新插件

    提取入口文件的key为一个数组,然后遍历,每个入口文件都添加热更新插件中间件 webpack-hot-middleware\

    Object.keys(baseWebpackConfig.entry).forEach(function(name) {

        baseWebpackConfig.entry[name] = [path.join(__dirname, 'dev-client')].concat(baseWebpackConfig.entry[name])

    })

    dev-client.js文件如下\

    require('eventsource-polyfill')\

    var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true')

\

    hotClient.subscribe(function(event) {

        if (event.action === 'reload') {

            window.location.reload()

        }

    })

2.output.filename 

    filename: '[name]/[name].js', //导出文件的文件名参数中[name] 指的是  entry对象中的键。

    如: entry: {detail: './src/main.js'}    [name] 就是detail.\

3.output.chunkFilename  

    chunkFilename: '[name]/[id].[chunkhash].js' // chunkFile 路径\

 在webpack3在引入模块时是可以定义chunkName的。使用特殊的注释法  \

const HelloWorld = () => import (/* webpackChunkName: "index/webworker" */, '../app.vue')  。如果不是webpack3 那么 [name]是chunkfile的编号。从0开始计数和[id]一样。[id]对应的chunkfile编号。

4.多模块html文件要引入对应的文件,多个入口文件应该有多个 对应HtmlWebpackPlugin实例。

new HtmlWebpackPlugin({

    filename: name + '/' + name + '.html', //生成的html的文件名

    template: htmls[name], //引入的html模板

    inject: true, //注入的js文件将会被放在body标签中,当值为'head'时,将被放在head标签中

    minify: { //压缩配置

        removeComments: true, //删除html中的注释代码

        collapseWhitespace: true, //删除html中的空白符

        removeAttributeQuotes: true //删除html元素中属性的引号

    },

    // 模板文件引入的名字

    chunks: [name, 'common'],  // 这里定义了对应的模块引入对应模块名字的文件和common 公共文件。

    chunksSortMode: 'dependency' //按dependency的顺序引入

}

5.静态资源的处理 

这里的处理方式,是不管是绝对路径还是相对路径引入的静态文件,都给重新定义一下路径为publicPath的路径(跟路径),

输出的时候根据对应的资源在建一个文件夹 ,这里是将图片静态资源都输出到根路径下的images文件,所有经过url-loader处理过的图片资源的url都会被重新定义为/images/   文件夹下面。其他资源的处理方法都是一样的。

{

    test: /.(png|jpe?g|gif|svg)(?.*)?$/,

    loader: 'url-loader',

    options: {

        limit: 1024, // 门限 小于1k的资源会被转成base64格式数据

        name: '[name].[ext]', // 输出文件的名字

        outputPath: publickPath + '/images/', // 输出路径 将静态资源打包到静态资源文件夹

        publicPath: '/' // 处理静态资源路径问题,重新定义路径为根目录

    }

},

6.中间件的热重载

vue官方事例中这个地方是注释掉的,如果打开这个方法的话。当页面改变的时候vue-style-loader的热重载就会失效,而是直接刷新页面。

//声明hotMiddleware无刷新更新的时机:html-webpack-plugin 的template更改之后

compiler.plugin('compilation', function(compilation) {

     compilation.plugin('html-webpack-plugin-after-emit', function(data, cb) {

       调试发现无法实现热重载是因为下面这个方法的原因,注释掉同样能够保留vue-style-loader的热重载。\

         hotMiddleware.publish({ action: 'reload' })  // 关闭可实现vue文件热重载.

         cb()

     })

})

7.对于loader提取css和不提取css的写法

webpack对于loader的使用顺序是从右向左的顺序,

例:['style-loader', 'css-loader']   如果匹配到了对应的文件,那么会优先使用css-loader 处理,最后再使用style-loader处理样式,如果顺序不对的话可能会报错。

    提取css\

    {\

        test: /.css$/,

        use: ExtractTextPlugin.extract({

            fallback: 'vue-style-loader',

            use: [{

                loader: 'css-loader',

                options: { minimize: true, sourceMap: true }   // minimize 是否压缩   sourceMap: 是否生成source-map文件

            }]

        })

    },

    {\

        test: /.less$/,

        use: ExtractTextPlugin.extract({

            fallback: 'vue-style-loader',

            use: [{

                    loader: 'css-loader',

                    options: { minimize: true, sourceMap: true }  // minimize 是否压缩   sourceMap: 是否生成source-map文件

                },

                { loader: 'less-loader', options: { sourceMap: true } }

            ]

        })

    },

不提取css

    {

        test: /.css$/,

        use: ['vue-style-loader',

            {

                loader: 'css-loader',

                options: { minimize: false, sourceMap: false }

            }

        ]

    },

    {

        test: /.less$/,

        use: ['vue-style-loader',

            {

                loader: 'css-loader',

                options: { minimize: false, sourceMap: false }

            },

            { loader: 'less-loader', options: { sourceMap: false } }

        ],

    },

8.vue-loader配置

webpack 1版本中的vue-loader配置是在 webpackconfig配置下有一个vue属性中配置的,配置方法跟webpack 2版本以上的vue-loader的options配置写法一样。

    {

        test: /.vue$/,

        loader: 'vue-loader',

        "options": {

            "loaders": {

                "postcss": [

                    "vue-style-loader",

                    {

                        "loader": "css-loader",

                        "options": { "minimize": false, "sourceMap": false} 

                    }

                ],

                "css": [

                    "vue-style-loader",

                    {

                        "loader": "css-loader",

                        "options": {"minimize": false,"sourceMap": false }

                    }

                ],

                "less": [

                    "vue-style-loader",

                    {

                        "loader": "css-loader",

                        "options": {"minimize": false,"sourceMap": false}

                    },

                    {

                        "loader": "less-loader",

                        "options": {"sourceMap": false}

                    }

                ],

                "scss": [

                    "vue-style-loader",

                    {

                        "loader": "css-loader",

                        "options": {"minimize": false,"sourceMap": false}

                    }

                ]

            },

            // 如果以下标签的src或者href有变化,会更新页面。

            "transformToRequire": {

                "video": "src",

                "source": "src",

                "img": "src",

                "image": "xlink:href"

            }

    }

提取css写法

 {

        test: /.vue$/,

        loader: 'vue-loader',

        "options": {

            "loaders": {

                "postcss": ExtractTextPlugin.extract({

                    fallback: 'vue-style-loader',

                    use:[

                        { "loader": "css-loader","options": { "minimize": false, "sourceMap": false}  }

                     ]

                }),

            }\

        }\

    }