从0到1 将静态网页项目进行工程化(第二章)

前言: 上一章节,完成了对静态网页进行了代码首页以及登录页的移植,利用webpack对页面中的资源进行整合打包,解决了静态资源的路径问题,并完成了打包产物的代码分离为js、css、image等多个文件区分,最后还配置了开发环境进行自动热更新功能。以上内容可查看 从0到1 将静态网页项目进行工程化(第一章)

第二章的目标是 性能优化,包含:

  • js css 代码压缩
  • treeshaking优化以及如何使用treeshaking
  • 针对大文件进行分割打包
  • 利用ejs对html进行复用

无工程化项目地址

tsx 复制代码
https://github.com/NewCoder798/ZBestPC

第一阶段:项目webpack改造

clean-webpack-plugin

打包时自动清除无关文件

tsx 复制代码
const { CleanWebpackPlugin } = require('clean-webpack-plugin')

性能优化

从bundle剥离css

tsx 复制代码
npm install --save-dev mini-css-extract-plugin

rules: [
      {
        test: /\.css$/,
        // use: ['style-loader', 'css-loader'],
        use: [MiniCssExtractPlugin.loader, 'css-loader'],
      }
  
  plugin
    new MiniCssExtractPlugin({
      filename: 'css/[name].css',
      chunkFilename: 'css/[name].chunk.css',
    }),

代码压缩 js/css

tsx 复制代码
npm i -D terser-webpack-plugin css-minimizer-webpack-plugin
// js压缩
const TerserPlugin = require('terser-webpack-plugin')
// css压缩
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin')

optimization: {
    // 是否开启代码压缩
    minimize: true,
    // 代码优化
    minimizer: [
      // js 代码压缩
      new TerserPlugin({ parallel: true }),
      // css代码压缩
      new CssMinimizerPlugin(),
    ],
  },

treeshaking

使用tree shaking 作用是删除无用代码:

  1. 必须使用ES6模块化语法 CommonJS不支持
  2. 通过结构的方式获取,可以触发tree shaking
  3. 同一文件的treeShaking有触发条件,条件就是mode=production
  4. 一定要注意使用解构来加载模块

splitChunks 代码分割打包

在没打包之前首页加载的js文件很大,性能查。需要对index.js中的代码进行分割,主要是可以将三方库进行分割。

javascript 复制代码
 optimization: {
    // 是否开启代码压缩
    minimize: true,
    // 代码优化
    minimizer: [
      // js 代码压缩
      new TerserPlugin({ parallel: true }),
      // css代码压缩
      new CssMinimizerPlugin(),
    ],
    // 代码分割
    splitChunks: {
      // 代码最小的分割大小
      minSize: 300 * 1024,
      // async 异步代码分割 initial 同步代码分割 all 同步异步代码分割都开启
      chunks: 'all',
      // 名称
      name: 'common',
      // 这里可以继续打包第三方库
      cacheGroups: {
        lodash: {
          test: /lodash-es/,
          name: 'lodash-es',
          // 优先级
          // priority:10,
          chunks: 'all',
        },
        jquery: {
          test: /jquery/,
          name: 'jquery',
          // priority: 10,
          chunks: 'all',
        },
      },
    },
  },

此时就将之前的大文件分成了三个文件。

ejs 公共代码复用

将html中头部和尾部的html代码使用ejs进行服用

javascript 复制代码
npm i ejs-loader

创建ejs文件后将html复制到文件中,并在需要具体插入ejs的位置输入语法

javascript 复制代码
<%=require('./ejs/header.ejs')({title: '首页123' }) %>
title支持传参 可以在ejs中进行接收    
<%=title%>
  
<%=require('./ejs/footer.ejs')() %>

以上是第一大部分的内容,接下去就是加入Vue来对项目进行进一步改造。 未完待续...

相关推荐
腾讯TNTWeb前端团队5 小时前
helux v5 发布了,像pinia一样优雅地管理你的react状态吧
前端·javascript·react.js
范文杰8 小时前
AI 时代如何更高效开发前端组件?21st.dev 给了一种答案
前端·ai编程
拉不动的猪9 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪9 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
FreeCultureBoy9 小时前
macOS 命令行 原生挂载 webdav 方法
前端
uhakadotcom10 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom10 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom10 小时前
React与Next.js:基础知识及应用场景
前端·面试·github
uhakadotcom10 小时前
Remix 框架:性能与易用性的完美结合
前端·javascript·面试
uhakadotcom10 小时前
Node.js 包管理器:npm vs pnpm
前端·javascript·面试