前端工程化实战-模块化开发与规范化标准

300 阅读2分钟

ES Modules基本特性

  • 自动采用严格模式,忽略'use strict'
  • 每个ESM模块都是单独的私有作用域
  • ESM是通过CORS去请求外部JS模块的
  • ESM的script标签会延迟执行脚本( 类似 deref )
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script type="module" src="app.js"></script>
</body>
</html>
// app.js
import { foo } from './module.js'
console.log(foo) // !!!foo 不能被修改


// module.js
const foo = 'es modules'
export { foo }


// nodejs 内置模块兼容ESM提取成员的方式
import { writeFileSync } from  'fs'

存在的问题

  • ES Modules 存在环境兼容问题
  • 模块文件过多,网络请求频繁
  • 所有的前端资源都需要模块化
  • 结论:模块化是必要的!

模块打包工具

  • 打包工具解决的是前端整体的模块化,并不单指JavaScript模块化
  • 模块打包器: 资源整合
  • 模块加载器: 编译转换
  • 代码拆分 : 按需加载

Webpack

快速上手

  • Loader 机制是Webpack的核心,通过添加相应的Loader,我们可以处理任何类型的文件。
  • webpack 建议根据代码的需要动态导入资源 JavaScript驱动了整个前端应用:
  • 1、逻辑合理,JS确实需要这些资源文件的配合来完成功能
  • 2、确保上线时资源文件不会缺失

要求速记:

  • webpack Dev Server 集成“自动编译”和“自动刷新浏览器”等功能
  • devtool: cheap-module-eval-source-map 最详细的source map
  • eval 使用eval执行模块代码
  • cheap 包含行内信息
  • module 能够得到Loader 处理之前的源代码

devtool 的详细内容可点击 这里 开发环境下,首选cheap-module-eval-source-map 原因如下:

  • 代码每行不会超过80个字符
  • 代码经过Loader 转换过后差异较大
  • 首次打包快慢无所谓,重写打包相对较快
  • 生产环境下,首选none,防止代码泄露,nosources-source-map勉强可以,会显示报错位置

Rollup

优点:

  • 输出结果更加扁平
  • 自动移除未引用代码
  • 打包结果依然完全可读

缺点:

  • 加载非ESM的第三方模块比较复杂
  • 模块最终都被打包到一个函数中,无法实现HMR
  • 浏览器环境中,代码拆分功能依赖AMD库
  • 适用:开发框架、类库

总结: Webpack大而全,Rollup小而美

Parcel

零配置的前端打包工具,非常容易上手,详情可点击这里