web前端webpack笔记

webpack4(三):全局变量、抽取公共代码

2020-12-10  本文已影响0人  姜治宇

全局变量

我们在页面请求ajax时,经常会区分环境,比如开发环境和正式环境,连的是不同地址。
src/index.js

if(DEV === 'development') {
    
    url = 'http://localhost:8888/user';
} else {
    
    url = '/user'
    
}

console.log(url);

//ajax代码
//......

那么这个DEV全局变量我们如何定义呢?
我们可以用webpack自带的DefinePlugin模块来搞定。

let path = require('path'); //node的path模块
let webpack = require('webpack');
module.exports = {
    mode:'development',//模式,默认两种 production和development
    entry:'./src/index.js', //入口
    output:{
        filename:'bundle.js', //打包后的文件名,名字随便起
        path: path.resolve(__dirname,'build') // 必须是绝对路径
    },
    plugins:[
        new webpack.DefinePlugin({
            DEV: JSON.stringify("development")
        })
    ]
}

这里需要注意的是,DEV变量后面跟的字符串是作为变量对待的,在打包时会解析这个变量,在声明时需注意。

抽取公共代码

在打包时,经常会遇到的一个问题就是:
如何不重复打包代码?
比如有a.js和b.js两个文件,我在home.js里面import了,然后在other.js里面也import了,那最后a和b会分别打包两次。
这明显不合理,如何只打包一次呢?

let path = require('path');

module.exports = {
    mode: 'development',//模式设置为开发环境的话,不走优化项optimization
    entry: {
        home: './src/home.js', //入口1
        other: './src/other.js', //入口2
    },
    output: {
        filename: '[name].[hash:8].js', //
        path: path.resolve(__dirname, 'build') // 必须是绝对路径
    },
    optimization: {
        splitChunks: {
            cacheGroups: {
                common: {
                    chunks: 'initial',
                    minSize: 0,
                    minChunks: 2//只要用过2次以上就抽离
                }
            }
        }
    }
}

只要引用两次以上的文件都会抽离出一个公共的js,然后引用。
不过这样还不行,如果是重复引入库文件呢?

//a.js
import $ from 'jquery';
console.log($);
console.log('我是a文件');
//b.js
import $ from 'jquery';
console.log($);
console.log('我是b文件');

按照之前的做法,就会把我们自己写的公共js和库文件一起打包成一个common文件。
这样就增加了耦合度,我们希望引入的就是干净的库文件,不需带有其他的东西。

let path = require('path');

module.exports = {
    mode: 'development',//模式设置为开发环境的话,不走优化项optimization
    entry: {
        home: './src/home.js', //入口1
        other: './src/other.js', //入口2
    },
    output: {
        filename: '[name].[hash:8].js', //
        path: path.resolve(__dirname, 'build') // 必须是绝对路径
    },
    optimization: {
        splitChunks: {
            cacheGroups: {
                common: {
                    chunks: 'initial',
                    minSize: 0,
                    minChunks: 2//只要用过2次以上就抽离
                },

                vendor: {//公共库抽离
                    priority: 1,//加优先级,库文件优先抽离
                    test: /node_modules/,
                    chunks: 'initial',
                    minSize: 0,
                    minChunks: 2,
                }
            }
        }
    }
}

这里需要保证库文件要优先打包抽离,然后再抽我们自己的公共js。

上一篇下一篇

猜你喜欢

热点阅读