其他
需要零配置打包 Web 应用、库或多入口项目时,用…
适用于希望用 Parcel 零配置构建 Web 应用、库或多入口项目,并利用其自动依赖安装、HMR、代码分割和优化能力的场景。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 35/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 40/100 ×0.15
适用场景
需要零配置打包 Web 应用、库或多入口特定
解决思路
- 默认采用零配置:初始不写构建配置,直接让 Parcel 工作。
- 让 Parcel 自动检测并安装依赖,不手动添加它可自动推断的 loader 或 plugin。
- 使用 Parcel 内置开发服务器和 hot module replacement 进行开发。
- 使用 Parcel 的 Rust-based compiler 获得原生性能,无需额外配置。
- 依赖 Parcel 的自动代码分割和优化能力。
- 按结构组织项目:`src/` 放 `index.html`、`index.js`、`styles.css`、`assets/`,`dist/` 自动生成,`.parcelrc` 可选,`package.json` 在根目录。
- 开发时运行 `parcel src/index.html` 启动热重载。
- 生产构建运行 `parcel build src/index.html`。
- 在 `package.json` 中添加 `dev` script 为 `parcel src/index.html`,`build` script 为 `parcel build src/index.html`,`clean` script 为 `rm -rf dist .parcel-cache`,并设置 `source` 为 `src/index.html`。
- HTML 入口中通过 `link rel=stylesheet href=./styles.css` 引入样式,通过 `script type=module src=./index.js` 引入脚本。
- JavaScript 入口构建可运行 `parcel build src/index.js --dist-dir lib`。
- 多入口构建运行 `parcel build src/index.html src/admin.html`。
- 直接使用 Parcel 内置支持的 JavaScript/TypeScript 文件:`.js`、`.jsx`、`.ts`、`.tsx`、`.mjs`。
- 直接使用 Parcel 内置支持的样式文件:`.css`、`.scss`、`.sass`、`.less`、`.styl`。
- 直接使用 Parcel 内置支持的 HTML 文件:`.html`、`.htm`。
- 直接使用 Parcel 内置支持的图片文件:`.png`、`.jpg`、`.gif`、`.svg`、`.webp`。
- 直接使用 Parcel 内置支持的字体文件:`.woff`、`.woff2`、`.ttf`、`.otf`、`.eot`。
- 直接使用 Parcel 内置支持的数据文件:`.json`、`.yaml`、`.toml`、`.xml`。
- 直接使用 Parcel 内置支持的 WebAssembly 文件:`.wasm`。
- 需要配置时创建 `.parcelrc`,设置 `extends` 为 `@parcel/config-default`。
- 在 `.parcelrc` 的 `transformers` 中按需配置,例如 `*.svg` 用 `@parcel/transformer-svg-react`。
- 在 `.parcelrc` 的 `reporters` 中加入 `parcel-reporter-bundle-analyzer` 等 reporter。
- 在 `package.json` 的 `targets` 中配置 `main` 的 `source`、`distDir`、`context`、`outputFormat`。
- TypeScript 自动处理:直接使用 `.ts` 或 `.tsx` 文件。
- 配置 `tsconfig.json` 的 `compilerOptions`:`target` 为 `ESNext`,`module` 为 `ESNext`,`moduleResolution` 为 `bundler`,`jsx` 为 `react-jsx`,`strict` 为 `true`,`esModuleInterop` 为 `true`,`skipLibCheck` 为 `true`,`isolatedModules` 为 `true`。
- React 自动处理 JSX:直接编写 JSX 组件,例如使用 `useState`。
- CSS 中通过 `import './styles.css'` 引入样式。
- CSS Modules 使用 `import * as styles from './Button.module.css'`,并通过 `styles.primary` 应用类名。
- Sass/SCSS 通过 `import './styles.scss'` 引入;使用 `.scss` 文件时 Parcel 会自动安装 `sass`。
- 导入资产:`import logo from './logo.png'`、`import data from './data.json'`,并在 JSX 中通过 `img src=logo alt=Logo` 使用。
- 使用 URL 引用资产:`const imageUrl = new URL('./image.png', import.meta.url);`。
- 用动态 `import()` 自动代码分割,例如 `React.lazy(() => import('./LazyComponent'))` 或 `await import('./heavy-module.js')`。
- 多入口共享代码时依赖 Parcel 自动创建 shared bundles。
- 环境变量:创建 `.env` 和 `.env.production` 文件,例如 `API_URL=https://api.example.com`。
- 在代码中用 `process.env.API_URL` 读取环境变量。
- 在 `package.json` 的 `targets.default` 中设置 `publicUrl`,例如 `/my-app/`。
- 开发服务器默认运行 `parcel src/index.html` 并服务在 `http://localhost:1234`。
- 自定义端口:`parcel src/index.html --port 3000`。
- 启用 HTTPS:`parcel src/index.html --https`。
- 代理 API 请求:在 `devServer.proxy` 中配置,例如 `/api` 指向 `http://localhost:8080`。
- 生产构建:`parcel build src/index.html`。
- 配置输出:`parcel build src/index.html --dist-dir build --public-url /app/`。
- 禁用 source maps:`parcel build src/index.html --no-source-maps`。
- 依赖 Parcel 自动 minify JavaScript、CSS、HTML、SVG。
- 依赖 Parcel 自动压缩图片。
- 依赖 Parcel 自动生成 content hashes 以利于缓存。
- 依赖 Parcel 自动 tree-shake 无用代码。
- 依赖 Parcel 自动 scope hoist 模块。
- 分析 bundle:运行 `npm install -D parcel-reporter-bundle-analyzer`,并在 `.parcelrc` 的 `reporters` 中加入 `parcel-reporter-bundle-analyzer`。
- 清理缓存:运行 `rm -rf .parcel-cache` 或构建时用 `parcel build --no-cache`。
- 开发插件时选择插件类型:Transformers 用于转换源文件。
- 开发插件时选择插件类型:Resolvers 用于自定义模块解析。
- 开发插件时选择插件类型:Bundlers 用于自定义打包逻辑。
- 开发插件时选择插件类型:Namers 用于自定义输出命名。
- 开发插件时选择插件类型:Packagers 用于打包 bundle。
- 开发插件时选择插件类型:Optimizers 用于优化 bundle。
- 开发插件时选择插件类型:Reporters 用于自定义构建报告。
- 插件规则:保持 stateless,避免内部状态。
- 插件规则:保持 pure,相同输入产生相同输出。
- 插件规则:无 side effects,不修改外部状态。
- 开发库时在 `package.json` 配置 `name`、`source`、`main`、`module`、`types`。
- 开发库时在 `targets` 中为 `main` 设置 `outputFormat` 为 `commonjs`。
- 开发库时在 `targets` 中为 `module` 设置 `outputFormat` 为 `esmodule`。
- 开发库时在 `targets` 中为 `types` 设置 `source` 为 `src/index.ts`。
- 最佳实践 Do:从零配置开始。
- 最佳实践 Do:让 Parcel 处理资产优化。
- 最佳实践 Do:使用动态 import 做代码分割。
- 最佳实践 Do:利用自动依赖安装。
- 最佳实践 Do:组件样式使用 CSS Modules。
- 最佳实践 Avoid:默认可用时不要过度配置。
- 最佳实践 Avoid:不要对抗 Parcel 的约定。
- 最佳实践 Avoid:不要手动优化 Parcel 已处理的内容。
- 最佳实践 Avoid:不要忽略构建警告和错误。
- SPA 模式:创建 `index.html`,包含 `meta charset=utf-8`、标题、`div id=root`、`script type=module src=./index.tsx`。
- 静态站点:运行 `parcel build src/*.html`。
- Web Worker:用 `new Worker(new URL('./worker.js', import.meta.url), { type: 'module' })` 创建。
- 故障排查清缓存:运行 `rm -rf .parcel-cache dist`。
- 输出详细日志:运行 `parcel build --log-level verbose`。
- 调试模式:运行 `DEBUG=parcel:* parcel build`。
- 从其他打包器迁移:移除 `webpack.config.js` 或类似配置。
- 从其他打包器迁移:移除 loader 或 plugin 依赖。
- 从其他打包器迁移:按需更新 import 语句。
- 从其他打包器迁移:让 Parcel 自动安装所需依赖。
适用边界 · 注意事项
- 不适用于不想引入 Parcel 或已深度使用其他打包器且不计划迁移的项目。
- 不适用于需要高度自定义构建流程且超出 Parcel 约定或插件能力的场景。
- 不适用于不能使用 npm/Node 生态或无法运行 Parcel CLI 的环境。