1.7 模块化与工程化
模块化和工程化是现代前端开发的重要组成部分,它们让代码更易维护、更易协作。
一、模块化
1. 为什么要模块化
- 代码复用:可多次使用
- 代码组织:清晰的结构
- 依赖管理:明确的引入规则
- 作用域隔离:避免全局污染
2. ES6 模块(ES Modules)
导出(Export)
javascript
// utils.js
// 命名导出
export const add = (a, b) => a + b;
export const subtract = (a, b) => a - b;
// 声明时导出
export function multiply(a, b) {
return a * b;
}
export class Calculator {
add(a, b) {
return a + b;
}
}
// 默认导出
const config = {
apiUrl: "https://api.example.com"
};
export default config;
// 混合导出
export default function greet(name) {
console.log(`Hello, ${name}!`);
}
export const age = 25;导入(Import)
javascript
// main.js
// 导入默认导出
import config from "./utils.js";
console.log(config.apiUrl);
// 导入命名导出
import { add, subtract } from "./utils.js";
console.log(add(1, 2));
console.log(subtract(5, 3));
// 重命名导入
import { add as sum } from "./utils.js";
console.log(sum(1, 2));
// 导入全部
import * as Utils from "./utils.js";
console.log(Utils.add(1, 2));
console.log(Utils.subtract(5, 3));
// 混合导入
import greet, { age } from "./utils.js";
greet("张三");
console.log(age);
// 仅导入(不导出任何内容,但执行模块代码)
import "./styles.css";二、包管理器
1. npm(Node Package Manager)
初始化项目
bash
# 初始化项目
npm init
npm init -y # 快速初始化
# 安装依赖
npm install <package-name> # 安装到 dependencies
npm install <package-name> -D # 安装到 devDependencies
npm install <package-name> -g # 全局安装
# 安装多个依赖
npm install webpack webpack-cli -Dpackage.json
json
{
"name": "my-project",
"version": "1.0.0",
"description": "My project",
"main": "src/index.js",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview",
"test": "jest"
},
"dependencies": {
"vue": "^3.3.4"
},
"devDependencies": {
"vite": "^4.4.0",
"eslint": "^8.45.0"
}
}npm 常用命令
bash
# 安装依赖
npm install
npm i
# 安装特定版本
npm install vue@2.6.14
# 更新依赖
npm update
# 卸载
npm uninstall <package-name>
npm remove <package-name>
# 查看已安装的包
npm list
npm ls
# 查看包信息
npm info <package-name>
# 运行脚本
npm run dev
npm run build2. yarn(更快、更可靠)
bash
# 安装 yarn(如果还没安装)
npm install -g yarn
# 初始化项目
yarn init
# 安装依赖
yarn add <package-name> # dependencies
yarn add <package-name> -D # devDependencies
# 运行脚本
yarn dev
yarn build
# 更新
yarn upgrade
# 卸载
yarn remove <package-name>3. pnpm(最快的包管理器)
bash
# 安装 pnpm
npm install -g pnpm
# 基本用法与 npm、yarn 类似
pnpm add <package-name>
pnpm add -D <package-name>
pnpm install
pnpm dev
pnpm build三、构建工具
1. Webpack
基本配置
javascript
// webpack.config.js
const path = require("path");
module.exports = {
entry: "./src/index.js",
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "dist"),
},
module: {
rules: [
{
test: /\.css$/,
use: ["style-loader", "css-loader"],
},
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: "babel-loader",
},
},
],
},
plugins: [], // 插件配置
mode: "development", // development 或 production
};常用Loader
javascript
module: {
rules: [
// CSS
{
test: /\.css$/,
use: ["style-loader", "css-loader"],
},
// Less
{
test: /\.less$/,
use: ["style-loader", "css-loader", "less-loader"],
},
// 图片
{
test: /\.(png|jpe?g|gif)$/,
type: "asset/resource",
},
// 字体
{
test: /\.(woff|woff2|eot|ttf|otf)$/,
type: "asset/resource",
},
],
}2. Vite(更快、更现代)
安装 Vite
bash
# 创建项目
npm create vite@latest my-project -- --template vue
# 或手动安装
npm install vite -D配置文件
javascript
// vite.config.js
import { defineConfig } from "vite";
import path from "path";
export default defineConfig({
root: "./src",
publicDir: "public",
server: {
port: 3000,
open: true,
},
resolve: {
alias: {
"@": path.resolve(__dirname, "src"),
},
},
build: {
outDir: "dist",
assetsDir: "assets",
},
});3. Parcel(零配置)
bash
# 安装
npm install parcel -D
# 开发
parcel src/index.html
# 构建
parcel build src/index.html四、代码规范(Linting)
1. ESLint
安装配置
bash
npm install eslint -D
# 初始化配置
npx eslint --init配置文件
javascript
// .eslintrc.js
module.exports = {
env: {
browser: true,
es2021: true,
node: true,
},
extends: "eslint:recommended",
parserOptions: {
ecmaVersion: "latest",
sourceType: "module",
},
rules: {
"no-unused-vars": "warn",
"no-console": "off",
"semi": ["error", "always"],
},
};检查和修复
bash
# 检查代码
npx eslint src/
# 自动修复
npx eslint src/ --fix2. Prettier
安装配置
bash
npm install prettier -D配置文件
json
// .prettierrc
{
"semi": true,
"singleQuote": true,
"tabWidth": 4,
"trailingComma": "es5"
}格式化代码
bash
# 检查格式
npx prettier --check src/
# 格式化代码
npx prettier --write src/VSCode 配置
json
// .vscode/settings.json
{
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
}
}五、构建流程
典型构建流程
源代码
↓
编译(转译 ES6+ → ES5)
↓
打包(模块 → 单个文件)
↓
压缩(移除空格、注释、优化)
↓
生成产物生产环境优化
bash
# 压缩代码
# 移除未使用的代码
# 代码分割
# 图片优化六、环境变量
.env 文件
bash
# .env.development
VITE_API_URL=http://localhost:3000/api
# .env.production
VITE_API_URL=https://api.example.com
# .env(所有环境)
VITE_APP_TITLE=My App使用环境变量
javascript
// Vite 项目中
console.log(import.meta.env.VITE_API_URL);
// Webpack 项目中
console.log(process.env.API_URL);七、总结
- 模块化:使用 ES Modules 组织代码
- 包管理:npm / yarn / pnpm 管理依赖
- 构建工具:Webpack / Vite 打包编译
- 代码规范:ESLint + Prettier 保证代码质量
- 持续集成:自动化测试、部署