关于项目打包优化,和element is defined的问题

项目打包时如何进行优化 ‘and’ 打包时element报错is defined

element is defined的问题将写在文章最后面

Ⅰ:可以使用vue-cli本身提供的性能分析工具进行打包分析 npm run preview – --report (四个 ‘-’ 符号)

Ⅱ:打包完成后会显现两个地址
在这里插入图片描述

我们可以输入下面的第二个网址,或者运行在打包后的(dist)文件夹下找到report.html文件,

分析页面效果如图:(左侧菜单栏可见总共大小为2.08M)
在这里插入图片描述

此时可以看到 “elementUI” 和 “xlsx” 两个文件占比较大,也说明了文件比较大。这样用户浏览的速度就会变慢,此时我们就要对文件大的进行优化处理。

注意: 如果想打包后能运行,记得在vue.config.js文件中把 ‘/’ 修改成 './'在这里插入图片描述

Ⅲ:同样在vue.config.js文件中,找到configureWebpack对象,在里面设置externals对象,在externals里写入过大的文件,代表不打包进最后的包里
在这里插入图片描述

代码如下:(便于复制)

externals: {
      'vue': 'Vue',
      'element-ui': 'ELEMENT',
      'xlsx': 'XLSX'
    }

我的打包排除了,Vue,element-ui,xlsx。

上面图片代码就是把打包后文件过大的,不打入最后的包里。这里只有第三方插件才可以进行此操作

Ⅳ:再次重新打包,就会发现其中不一样之处了在这里插入图片描述
由2.08M变成了448.24K,是不是小了很多!?但是此时的项目也等于没有Vue,ElementUI和xlsx,项目也无法正常运行了。

解决方法:引入外部资源(通过第三方的CDN方式引入)

这里就不再对CDN进行细说,直接进入正题

Ⅰ:依然在vue.config.js文件中,可进行定义两个空对象,(必须使用let定义空变量,因为vscode会自动转成const,记得改回let)
在这里插入图片描述
代码如下:(便于复制)

// 空对象  用于在configureWebpack中直接调用
let externals = {}
// 空对象 数组,用来存放css和js文件
let cdn = { css: [], js: [] }
// 判断是否是生产环境
const isProdution = process.env.NODE_ENV === 'production'
if (isProdution) {
  externals = {
    'vue': 'Vue',
    'element-ui': 'ELEMENT',
    'xlsx': 'XLSX'
  }
  cdn = {
    css: [
      // element-ui css 样式表
      'https://unpkg.com/element-ui/lib/theme-chalk/index.css'
    ],
    js: [
      // vue must at first!
      'https://unpkg.com/vue@2.6.12/dist/vue.js', // vuejs
      'https://unpkg.com/element-ui/lib/index.js', // element-ui js
      'https://cdn.jsdelivr.net/npm/xlsx@0.16.6/dist/xlsx.full.min.js'
    ]
  }
}

上面图片中的路径,可参考 https://unpkg.com/

Ⅱ:在configureWebpack对象中,把原来写的externals对象注释掉,更改使用方法在这里插入图片描述
Ⅲ:两个空对象,已经使用了一个,下面使用第二个

在这里插入图片描述
代码如下:(便于复制)

// 注入 cdn 变量 (打包时会执行)
    config.plugin('html').tap(args => {
      args[0].cdn = cdn // 配置cdn给插件
      return args
    })

从图片中代码 113行 开始,就是我们使用的第二个空对象。上面有注释,我就不多解释了

Ⅳ: 在public文件夹下找到 index.html 通过配置CDNConfig 依次注入 css 和 js。
在这里插入图片描述
代码如下:(便于复制)

<!-- 引入CSS -->
    <% for(var css of htmlWebpackPlugin.options.cdn.css) { %>
        <link rel="stylesheet" href="<%=css%>">
    <% } %>

<!-- 引入JS -->
    <% for(var js of htmlWebpackPlugin.options.cdn.js) { %>
        <script src="<%=js%>"></script>
    <% } %>

Ⅴ:重新打包查看效果即可(此时可以是package.json中的打包命令)我的为:npm run build:prod


Ⅵ:至于打包后运行 显示 element is defined的问题,

externals = {
    'vue': 'Vue',
    'element-ui': 'ELEMENT',
    'xlsx': 'XLSX'
}

如果你的element-ui的值,不是大写的ELEMENT,那么就会报 element is defined 的错误,只需改成ELEMENT即可。

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值