Vue项目打包及优化处理

项目打包

1. 打包介绍

什么是项目打包

项目开发是通过import这样的模块化技术完成的,而import代码在浏览器中不能直接运行。

项目开发是通过vue单文件组件方式开发完成的,浏览器不能运行vue单文件组件。

项目开发是通过less进行css样式控制的,浏览器不能运行less文件。

项目开发是通过element-ui组件库开发,浏览器不能运行组件库组件。

项目开发是通过es6/es7等高级js技术完成的,中低浏览器版本不能运行es6/es7等高级语法。

……

基于以上若干,项目发布之前需要做打包处理,就是把import代码变为浏览器可以识别的代码,把vue单文件组件代码也解析成为浏览器可以识别的,less变为css、element-ui变为具体的html标签、es6/es7变为es5兼容性更强的代码,这个过程就是“打包”。

Vue项目打包及优化处理_第1张图片

  • 打包完毕,生成的应用程序文件只有一个,名称为index.html,网站所有请求都需要执行该文件,就称为单页面应用程序项目(spa),当然这个index.html文件会引入许多js、css等文件。

2. 打包实现

项目打包实现

在项目根目录执行如下指令:

npm run build   // 物理打包
或
.\node_modules\.bin\vue-cli-service build --report  // 打包 同时 要生成详情报告

以上两个指令打包完毕,会在根目录生成dist目录,内部都是打包好的文件,

执行第二种打包指令,会在dist里边生成report.html文件,并且支持直接访问,就可以看到各个打包内容部分的占比情况。

Vue项目打包及优化处理_第2张图片

上图:前3个js文件 都是系统级 代码打包后的文件,体积比较大

给项目做打包操作,生成许多js、css、img、字体库文件:

其中的css文件

  1. 每个vue组件文件内部的css都要独立打包到具体的文件中。

  2. 富文本编辑器的css样式打包到指定文件。

  3. element-ui组件库的css样式打包到指定文件。

其中的js文件

  1. 每个vue组件文件内部的js都要独立打包到具体的文件中。
  2. node_modules内部核心的项目级的js被独立打包(vue)。
  3. 富文本编辑器的js内容单独打包。

注意

​ 把项目中各个文件中console.log()的输出内容都屏蔽掉。

项目优化

什么是项目优化

查看各个项目打包后的内容占比:

执行指令:

.\node_modules\.bin\vue-cli-service build --report

之后浏览器执行运行打包好的report.html文件

各个文件内容在打包文件中占比如下图所示:

Vue项目打包及优化处理_第3张图片

优化介绍

对项目的打包文件做体积减少操作,用到的东西就打包,不用的就舍弃

再者有些模块能通过第3方提供就直接使用,总之要把打包文件的体积做到最小。

好处

  1. 节省网络带宽,节省money。
  2. 首屏数据加载快、增强用户体验。

1. 优化处理(externals)

什么是externals(额外/外部)优化

互联网有许多公司已经对公共的模块文件(axios、vue、echarts、nprogress、vue-router)做了提供,项目开发时可以直接拿过来使用,这样自己不用准备了,项目打包时也不用引入了,进而使得打包文件体积减少。

Vue项目打包及优化处理_第4张图片

  • 配置使用第三方公司网络资源

步骤

  1. 做vue.config.js文件配置

    module.exports = {
           
      lintOnSave: true, // 文件保存时就做eslint规范检测
      devServer: {
           // 实时保存、编译的配置段
        open: true, // 自动开启浏览器
        port: 19988, // 服务运行端口
      },
      configureWebpack: config => {
           
        // 配置 externals
        // 防止将某些 import 的包(package)打包到 bundle 中,
        // 而是在运行时(runtime)再去从外部获取这些扩展依赖
        config.externals = {
           
          // 模块名(from后边的名字): 构造函数名称(文件内部提供的全局变量名字)
          vue: 'Vue',
          axios: 'axios',
          'vue-router': 'VueRouter',
          echarts: 'echarts',
          nprogress: 'NProgress',
        }
      }
    }
    

上述配置:

devServer说明: https://cli.vuejs.org/zh/config/#devserver

configureWebpack说明: https://cli.vuejs.org/zh/config/#configurewebpack

  1. 打开 public/index.html 文件(项目主模板文件),做第三方资源的引入配置。

    第三方资源提供网址:https://www.bootcdn.cn/ (其他的也有,这个比较稳定)。

    
    <html lang="en">
      <head>
        <meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width,initial-scale=1.0" />
        <link rel="icon" href="<%= BASE_URL %>favicon.ico" />
        <title>toplinetitle>
        
        <script src="https://cdn.bootcss.com/axios/0.19.0/axios.min.js">script>
        <script src="https://cdn.bootcss.com/vue/2.6.10/vue.runtime.min.js">script>
        <script src="https://cdn.bootcss.com/vue-router/3.1.3/vue-router.min.js">script>
        <script src="https://cdn.bootcss.com/echarts/4.3.0/echarts.min.js">script>
        <script src="https://cdn.bootcss.com/nprogress/0.2.0/nprogress.min.js">script>
      head>
      <body>
        <div id="app">div>
      body>
    html>
    

以上两个步骤配置完毕

  1. (物理打包时)项目中再import引入相关的资源,就不会走本身的,转而执行第三方的。
  2. import等语句不要删除了,因为开发时候npm run serve还需要。

注意

第三方网站并不会提供全部的公共资源(提供哪个就用哪个)。

再次执行命令做打包操作,发现主js文件较比之前变小了:

.\node_modules\.bin\vue-cli-service build --report

Vue项目打包及优化处理_第5张图片

注意:上图打包文件的名称较比之前会有变化,每次生成的打包文件名称都会不一样。

2. 优化处理(Element-UI组件库按需引入)

给element-ui组件库 做完全按需引入优化,具体给 组件事件方法 都做按需引入。

步骤

  1. 在main.js文件中 把 element-ui的引入注册都屏蔽掉。

  2. 创建utils/element.js文件做element-ui的按需引入。

    // 导入vue
    import Vue from 'vue'
    // 按需导入需要的组件
    import {
           
      DatePicker,
      Dropdown,
      DropdownMenu,
      DropdownItem,
      Pagination,
      Dialog,
      Menu,
      Submenu,
      MenuItem,
      Input,
      Radio,
      RadioGroup,
      RadioButton,
      Checkbox,
      Select,
      Option,
      Button,
      Table,
      TableColumn,
      Form,
      FormItem,
      Tag,
      Icon,
      Upload,
      Card,
      Container,
      Header,
      Aside,
      Main,
      MessageBox,
      Message,
      Tabs,
      TabPane
    } from 'element-ui'
    // 注册组件
    Vue.use(DatePicker)
    Vue.use(Dropdown)
    Vue.use(DropdownMenu)
    Vue.use(DropdownItem)
    Vue.use(Pagination)
    Vue.use(Dialog)
    Vue.use(Menu)
    Vue.use(Submenu)
    Vue.use(MenuItem)
    Vue.use(Input)
    Vue.use(Radio)
    Vue.use(RadioGroup)
    Vue.use(RadioButton)
    Vue.use(Checkbox)
    Vue.use(Select)
    Vue.use(Option)
    Vue.use(Button)
    Vue.use(Table)
    Vue.use(TableColumn)
    Vue.use(Form)
    Vue.use(FormItem)
    Vue.use(Tag)
    Vue.use(Icon)
    Vue.use(Upload)
    Vue.use(Card)
    Vue.use(Container)
    Vue.use(Header)
    Vue.use(Aside)
    Vue.use(Main)
    Vue.use(Tabs)
    Vue.use(TabPane)
    // 注册方法
    Vue.prototype.$confirm = MessageBox.confirm
    Vue.prototype.$message = Message
    
  3. 在main.js文件中引入 element.js

    // 引入element.js
    import '@/utils/element.js'
    

​ 再次执行打包命令,发现主js文件体积更小了:

.\node_modules\.bin\vue-cli-service build --report

Vue项目打包及优化处理_第6张图片

你可能感兴趣的:(前端,vue,JS,前端,webpack,vue.js)