面试题库 词条目录
前端Wiki/面试题库/框架与工程化/工程化与软技能

前端工程化与打包构建

前端工程化是把“个人手艺”变成“工业流水线”:规范(ESLint / Stylelint / Prettier / husky + lint-staged 预提交钩子)、模块化(ESM)、构建(Webpack / Vite / Rollup / esbuild)、CI/CD(GitLab CI / GitHub Actions:lint → test → build → 部署)、质量(单元测试 Vitest / Jest、E2E Playwright)。构建工具的核心动作是:依赖收集 → 编译转换(TS / JSX / SCSS → 浏览器认识的代码) → 压缩混淆 → 代码分割(按需加载) → 长缓存(文件名哈希)。

面试爱问 Webpack vs Vite:Webpack 打包慢因为要“先编完再启动”;Vite dev 用浏览器原生 ESM 按需编译,启动近秒开,prod 用 Rollup 打包。追问会到 Tree Shaking(依赖 ESM 静态分析,import 的才打进包)、Babel(语法转换:箭头函数 / 可选链降级)、polyfill(core-js 按需注入)。

  • 工程化五件套:规范 + 模块化 + 构建 + CI/CD + 测试
  • 构建核心:依赖收集 → 编译 → 压缩 → 分割 → 哈希缓存
  • Vite dev 快于 Webpack 的本质:浏览器原生 ESM 按需编译 vs 全量打包
JS
// Node 侧演示构建产物优化点(概念性 demo)
const { build } = require("vite");

// vite.config.js:生产构建三件套
const config = {
  build: {
    target: "es2018",               // 语法降级目标
    minify: "esbuild",             // 压缩(比 terser 快一个量级)
    rollupOptions: {
      output: {
        // 代码分割:第三方单独成包,利用长缓存
        manualChunks: {
          vendor: ["vue", "vue-router", "pinia"],
        },
        // 入口文件之外的资源都带哈希:[name].[hash].js
        entryFileNames: "assets/[name].[hash].js",
        chunkFileNames: "assets/[name].[hash].js",
      },
    },
  },
};

// Tree Shaking 原理演示:只 import 用到的
// import { debounce } from "lodash-es";       // ✓ 按需引入,摇掉其余
// import _ from "lodash";                      // ✗ 整包进来

// 预提交钩子(package.json)
/*
  "husky": { "hooks": { "pre-commit": "lint-staged" } },
  "lint-staged": { "*.{js,ts,vue}": ["eslint --fix", "prettier --write"] }
*/

console.log("npm run lint ->  eslint .");
console.log("npm run test ->   vitest");
console.log("npm run build ->  vite build");
console.log("CI: lint -> test -> build -> deploy");
本节要点工程化 = 规范 + 构建 + 流水线 + 测试;Vite 秒开的本质是浏览器原生 ESM 按需编译;缓存策略靠文件名哈希。