vue 配置webpack使用externals使用cdn减小打包后的大小

994 阅读1分钟

vue 配置webpack使用externals使用cdn减小打包后的大小

在vue.config.js中这样配置

const webpack = require('webpack')

const assetsCDN = {
    // webpack build externals(webpack构建外链)
    externals: {
        vue: 'Vue',
        vuex: 'Vuex',
        axios: 'axios',
        'vue-router': 'VueRouter'
    },
    css: [],
    // https://unpkg.com/browse/vue@2.6.10/ (vue的cdn地址)
    js: [
        // vue的压缩js (也可以下载下来,改成本地文件访问;因为有时候这个镜像会在国外,我们国内访问的话慢或者访问不到。可以使用unpkg.com的国内镜像地址: unpkg.zhimg.com)
        'https://unpkg.com/vue@2.6.10/dist/vue.min.js',
        'https://unpkg.com/vuex@4.0.2/dist/vuex.global.js',
        'https://unpkg.com/vue-router@3.5.4/dist/vue-router.min.js',
        'https://unpkg.com/axios@0.27.2/dist/axios.min.js'
    ]
}

module.exports = {
    configureWebpack: {
        // 视为一个外部库,而不将它打包进来
        externals: assetsCDN.externals
    },
    chainWebpack: (config) => {
        config.plugin('html').tap(args => {
            args[0].cdn = assetsCDN
            return args
        })
    }
}

unpkg这个是前端资源cdn(公共静态资源库unpkg),由于它服务器放在国外的,我们在国内的访问速度可能会稍微慢点,但是它有个国内的镜像unpkg.zhimg.com。unpkg能加载所有npm里面的任何文件,使用url的地址拼接方式如下:

https://unpkg.com/:package@:version/:file

这里的话可以去官网看一下更深层次的用法。

除了unpkg这种依赖包的CDN资源,还有以下的cdn资源:
www.bootcdn.cn/
www.staticfile.org/

配完上面的vue.config.js后,就需要在html里面引入这些cdn了

<!DOCTYPE html>
<html lang="">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initital-scale=1.0">
        <link rel="icon" href="<%= BASE_URL %>favicon.ico">
        
        // 循环引入cdn中的css文件
        <%
            for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.css) {
        %>
            <link rel="stylesheet" type="text/css" href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" />
        <% } %>
        
        // 循环引入cdn中的js文件
        <%
            for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) {
        %>
            <script type="text/javascript" href="<%= htmlWebpackPlugin.options.cdn.js[i] %>" />
        <% } %>
    </head>
</html>

默认情况下,通过import语法导入的第三方依赖包,最终会被打包合并到同一文件中,从而导致打包成功后,单文件体积过大的问题。通过externals加载外部CDN资源,在生产环境第三方库采用cdn引入,能有效减小打包出来的文件体积。凡是声明在externals中的第三方依赖包,都不会被打包,而是用配置好的cdn的代码。