返回

后端保护构建现代前端开发应用

前端

接上篇,继续完善项目的构建。

开发速度优化

避免缓存干扰,加入 hash

目前我们生成的上篇文章中,css 文件输出 filename:'[name].[hash:8].css',但 js 固定

filename:'[name].js'。对于这个webpack 自动加 hash 的操作,注意需要在 package.json 中启动 hash,

我们可以将它改为:[name].[hash:8].js',这样做的好处是:

1.避免缓存干扰,对于前端js,每次更新后它会生成不同的hash值,比如以前版本是 app.[hash:8].js,现在版本是app.[hash:8].js。如此,浏览器就会认为这是两个不同的资源,进而都会下载,前端页面就得以更新。

2.浏览器并行下载,因为浏览器同时检测到需要下载两个文件,它会并行请求去下载这两个文件。这样做就可以提高我们的构建速度。

代码压缩

webpack 中我们可以使用插件来对我们的代码进行压缩,前端可以用 TerserWebpackPlugin,后端可以用 UglifyJsPlugin。我们只需要在我们的 webpack.config.js 中配置好对应的 plugin,webpack 就知道如何去压缩我们的代码了。

publicPath 配置:

当我们使用 webpack 去构建项目时,要注意 baseUrl 的配置,最理想的情况当然是后端那边通过 api 获取数据,然后通过接口拿到文件后缀对应的文件内容,再进行下载并编译,但我们的项目中并没有使用此种形式,我们只是简单的对接口做了路由配置,所以我们的 baseUrl 还是相对路径比较好。

相关配置:

output:{
  publicPath: './'
}

分离构建

对于一些比较大的项目,webpack 提供了分离构建的选项,我们可以将我们的代码进行分离构建,比如将其分为前端构建和后端构建,这样可以极大地提升我们的构建速度,因为我们可以同时构建我们的前端和后端,而不是顺序构建。

相关配置:

const {WebpackManifestPlugin} = require('webpack-manifest-plugin')

output:{
  publicPath: './',
  chunkFilename: 'js/[name].js?[hash:8]'
}

plugins:[
  new WebpackManifestPlugin({
    fileName: 'asset-manifest.json'
  })
]

分离构建之后,我们可以看到我们的文件多了 asset-manifest.json 这个文件,它里面记录了我们的资源和它的对应的 hash 值。我们通过后端将这个文件读取出来,再将其提供给前端,前端再根据这个文件去请求相关的资源。

上面的只是分离构建的其中一种方式,还有很多种方式可以进行分离构建,这里就不一一列举了。

模块化开发

对于比较大的项目,我们通常会采用模块化开发的方式来进行开发,模块化开发可以让我们更加容易地管理我们的代码,并且可以复用我们的代码,提高我们的开发效率。

Webpack 提供了多种方式来支持模块化开发,最常见的方式就是使用 CommonJS 模块化语法,我们可以通过 require() 函数来引入其他模块,也可以通过 exports 对象来导出我们的模块。

// app.js
const util = require('./util')

util.sayHello()
// util.js
function sayHello(){
  console.log('hello world')
}

module.exports = {
  sayHello
}

Webpack 还可以支持 ES Module 模块化语法,我们可以通过 import() 函数来引入其他模块,也可以通过 export 来导出我们的模块。

// app.js
import util from './util'

util.sayHello()
// util.js
function sayHello(){
  console.log('hello world')
}

export default {
  sayHello
}

资源优化

Webpack 提供了多种方式来优化我们的资源,比如我们可以使用代码压缩、图片压缩、字体压缩等方式来优化我们的资源,还可以使用雪碧图、base64 等方式来减少我们的资源请求次数。

const ImageminPlugin = require('imagemin-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')

module:{
  rules:[
    {
      test:/\.jpg$/,
      use:[
        {
          loader: 'image-webpack-loader',
          options:{
            mozjpeg:{
              quality: 65
            }
          }
        }
      ]
    }
  ]
}

plugins:[
  new HtmlWebpackPlugin({
    template: './src/index.html',
    minify: {
      collapseWhitespace: true,
      removeComments: true,
      removeRedundantAttributes: true,
      useShortDoctype: true
    }
  }),
  new ImageminPlugin({
    pngquant:{
      quality: '65-80'
    }
  })
]

性能提升

Webpack 提供了多种方式来提升我们的性能,比如我们可以使用代码分割、懒加载、CDN 等方式来提升我们的性能。

module:{
  rules:[
    {
      test:/\.js$/,
      use:[
        {
          loader: 'babel-loader',
          options:{
            presets:['@babel/preset-env']
          }
        }
      ]
    }
  ]
}

plugins:[
  new webpack.optimize.SplitChunksPlugin({
    cacheGroups:{
      commons:{
        test:/[\\/]node_modules[\\/]/,
        name:'vendor',
        chunks:'all'
      }
    }
  })
]

开发效率

Webpack 提供了多种方式来提高我们的开发效率,比如我们可以使用热更新、代码提示、错误提示等方式来提高我们的开发效率。

module:{
  rules:[
    {
      test:/\.js$/,
      use:[
        {
          loader: 'eslint-loader',
          options:{
            formatter: require('eslint-friendly-formatter')
          }
        }
      ]
    }
  ]
}

devServer:{
  contentBase: './dist',
  hot: true
}