vue-cli webpack2项目打包优化分享

Vue-CLI webpack2项目打包优化分享

引言

作为Vue.js的开发者,我们在构建Vue.js项目的时候,尤其是当你的项目变得越来越庞大时,打包的时间会变得越来越慢。这不仅拖慢了我们开发的频率,也降低了我们的开发效率。在这里,我们将从webpack2的角度来分享优化Vue.js打包的一些技巧和经验。

优化打包时间

1. 使用 HappyPack

HappyPack是一个使Webpack在使用Loader时更快的插件,它通过多线程解析代码,加速编译速度。通过它,可以使打包时间大大缩短,特别适合大型项目的打包优化。

npm install --save-dev happypack
// webpack.config.js
const HappyPack = require('happypack')
const os = require('os')
const happyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length })

module.exports = {
  //...
  module: {
    rules: [
      {
        test: /\.js$/,
        use: 'happypack/loader?id=js',
        exclude: /node_modules/
      },
      {
        test: /\.vue$/,
        use: 'happypack/loader?id=vue',
        exclude: /node_modules/
      }
    ]
  },
  plugins: [
    new HappyPack({
      id: 'js',
      threadPool: happyThreadPool,
      loaders: ['babel-loader?cacheDirectory']
    }),
    new HappyPack({
      id: 'vue',
      threadPool: happyThreadPool,
      loaders: ['vue-loader']
    })
  ]
}

2. 使用DllPlugin

DllPlugin是webpack内置的插件,用于把通用的依赖文件提出来单独打包,减少其他模块的编译时间。由于vendor是我们最常用的依赖,使用DllPlugin将会进一步减小我们用于构建的vendor文件的体积,使我们的构建时间更快。

安装DllPlugin:

npm install --save-dev webpack-dll-plugin

创建webpack.dll.conf.js配置文件:

const path = require('path')
const webpack = require('webpack')

module.exports = {
  entry: {
    vendor: [
      'vue',
      'vue-router',
      'vuex',
      'lodash'
    ]
  },
  output: {
    path: path.join(__dirname, '../static/js'),
    filename: '[name].dll.js',
    library: '[name]_library'
  },
  plugins: [
    new webpack.DllPlugin({
      path: path.join(__dirname, '[name]-manifest.json'),
      name: '[name]_library',
      context: __dirname
    })
  ]
}

在webpack.base.conf.js中引入DllReferencePlugin:

// webpack.base.conf.js
const webpack = require('webpack')
//...

module.exports = {
  //...
  plugins: [
    new webpack.DllReferencePlugin({
      context: __dirname,
      manifest: require('./vendor-manifest.json')
    })
  ]
}

在打包构建vendor文件的时候,可以使用如下命令:

npm run build:dll

优化打包质量

1. 代码规范

为了保证我们代码的可读性和维护性,我们应该使用ESLint来保持代码规范性。在这里推荐一种基于eslint-config-airbnb和eslint-plugin-vue的语法校验方案。

npm install --save-dev eslint eslint-config-airbnb eslint-plugin-vue eslint-loader
// .eslintrc.js
module.exports = {
  parser: 'babel-eslint',
  parserOptions: {
    sourceType: 'module'
  },
  extends: 'airbnb',
  env: {
    browser: true,
    es6: true
  },
  plugins: [
    'vue'
  ],
  rules: {
    'no-param-reassign': [2, { 'props': false }],
    'no-shadow': 0,
    'no-console': [2, { allow: ['warn', 'error'] }],
    'no-return-assign': 0,
    'no-underscore-dangle': 0,
    'consistent-return': 0,
    'import/first': 0,
    'import/no-unresolved': 0,
    'import/prefer-default-export': 0,
    'import/extensions': 0,
    'import/no-extraneous-dependencies': 0,
    'vue/jsx-uses-vars': 2,
    'vue/max-attributes-per-line': [2, {
      'singleline': 10,
      'multiline': {
        'max': 1,
        'allowFirstLine': false
      }
    }],
    'vue/prop-name-casing': [2, 'camelCase'],
    'vue/name-property-casing': [2, 'PascalCase'],
    'vue/html-self-closing': [2, {
      'html': {
        'void': 'never',
        'normal': 'never',
        'component': 'always'
      },
      'svg': 'always',
      'math': 'always'
    }]
  }
}

2. 按需加载

在Vue.js中,我们可以使用异步组件来实现按需加载,这样可以在路由控制的时候,只加载需要的组件。使用异步组件可以减少app浏览器的加载时间,提高页面的渲染速度。

使用require.ensure()方法按需加载:

import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router)

const router = new Router({
  routes: [
    {
      path: '/',
      name: 'Home',
      component: resolve => require.ensure([], () => resolve(require('@/components/Home')), 'Home')
    },
    {
      path: '/about',
      name: 'About',
      component: resolve => require.ensure([], () => resolve(require('@/components/About')), 'About')
    }
  ]
})

在这个例子中,我们只在需要这个组件的时候才会动态加载。require.ensure()有三个参数,第一个参数为依赖数组,第二个参数是返回的模块,第三个参数是chunk name(加载器的名称)。

结论

在以上分享中,我们提供了两种常见的优化方式:HappyPack和DllPlugin用于优化打包时间,ESLint和按需加载用于优化打包质量。虽然这些优化策略并不是常规的优化方式,但在面对大型的Vue.js项目时,这些优化方法是帮助我们优化项目构建的更快和准确的方式之一。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue-cli webpack2项目打包优化分享 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • Express+Nodejs 下的登录拦截实现代码

    下面是Express+Nodejs下的登录拦截实现代码的攻略: 一、前置知识 在学习登录拦截实现之前,需要掌握以下知识: Node.js基础知识,包括模块化、文件系统、HTTP模块等; Express框架的基本使用方法; cookie和session的基本概念和使用方法。 二、实现登录拦截的基本思路 实现登录拦截需要结合cookie和session技术,其基…

    node js 2023年6月8日
    00
  • npm安装依赖报错ERESOLVE unable to resolve dependency tree的解决方法

    下面是详细讲解“npm安装依赖报错ERESOLVE unable to resolve dependency tree的解决方法”的完整攻略。 问题背景 在使用npm安装依赖时,有时会出现如下错误提示: npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm…

    node js 2023年6月8日
    00
  • typescript路径别名问题详解与前世今生的故事

    Typescript路径别名问题详解与前世今生的故事 在 Typescript 项目中,我们常常需要引用比较深层级的文件或者是一些公共模块。为了避免编写冗长的相对路径,Typescript 支持使用路径别名来简化路径,本篇文章将详细讲解 Typescript 路径别名以及在实际项目中的应用。 什么是路径别名? 路径别名其实就是对长路径的简称,在 Typesc…

    node js 2023年6月9日
    00
  • node.js中的fs.mkdirSync方法使用说明

    Node.js中的fs模块提供了文件系统相关的API,其中mkdirSync方法用于创建目录。本文将详细讲解fs.mkdirSync方法的使用说明。 fs.mkdirSync方法介绍 fs.mkdirSync方法用于同步创建目录。它的语法如下: fs.mkdirSync(path[, options]) 其中,path为要创建的目录路径,options为可选…

    node js 2023年6月8日
    00
  • Vue项目通过node连接MySQL数据库并实现增删改查操作的过程详解

    让我详细讲解一下Vue项目通过node连接MySQL数据库并实现增删改查操作的过程。 准备工作 首先,你需要有一个Vue项目,可以使用Vue CLI等工具创建一个空白项目。 其次,你需要安装一些依赖,包括mysql、express、body-parser、cors等,可以通过npm install命令安装。 创建数据库和数据表 打开MySQL数据库客户端,创…

    node js 2023年6月8日
    00
  • Node.js查询MySQL并返回结果集给客户端的全过程

    下面提供一个完整的“Node.js查询MySQL并返回结果集给客户端的全过程”。 步骤一:安装和配置 首先,在本地安装Node.js和MySQL服务。然后,使用npm安装mysql模块,它是连接到MySQL的标准Node.js库。可以在终端中运行以下命令进行安装: npm install mysql 接下来,在项目中引入mysql模块,以便使用它的API: …

    node js 2023年6月8日
    00
  • node.js 和HTML5开发本地桌面应用程序

    Node.js 和 HTML5 技术可以结合在一起来开发本地桌面应用程序。下面是一些步骤,可以帮助你开始构建本地桌面应用程序。 步骤一:安装 Node.js 首先,你需要安装 Node.js。在 Node.js 的官方网站上,你可以下载 Node.js 的安装包,并按照官方文档的说明进行安装。 步骤二:安装 Electron Electron 是一种可以使用…

    node js 2023年6月8日
    00
  • 关于js中for in的缺陷浅析

    关于js中for in的缺陷浅析 1. for in 的作用 for in 是 JavaScript 中用来遍历对象属性的一种语句,其语法是: for (variable in object) { code block to be executed } 其中,变量 variable 是用来存储对象的属性名的,object 是需要遍历的对象,代码块中包含了对每…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部