美文网首页
frontendmasters webpack-fundamen

frontendmasters webpack-fundamen

作者: 云峰yf | 来源:发表于2018-11-02 14:25 被阅读0次

    Introduction

    本质上就是个命令行工具

    • 沿袭自 npm 的脚本和生态系统

    Problems with Script Loading

    管理 js

    • 最初用 IIFE
    • 后来的 gulp 等目的只是将文件连接在一起
    • 传统的模块化方式迫使 JavaScript 引擎急于解析代码,从而引起性能浪费。懒加载和摇树才是我们想要的。

    History of Modules

    模块化

    • CommonJS 和 npm,但没有浏览器支持
    • 需要解决自我引用和循环引用的问题
    • require 实际上是一个可以传递到任何地方的函数,所以 webpack 重新定义了 require
    • 下一个问题是如何异步加载,用 AMD 解决吗?NO,那像是依赖注入,太动态化了。

    EcmaScript Modules (ESM)

    对模块化问题的解决方案

    • Node 的 ESM 有点悬而未决
    • 浏览器的 ESM 非常慢

    Introducing Webpack

    所有的资产都有模块

    • Webpack 是一个模块捆绑器
    • Webpack 支持代码分割或静态异步捆绑
    • 之后诞生了热更新功能,甚至是 redux

    Configuring Webpack

    有三种方法可以使用 Webpack

    • cli
    • 配置
    • node,像 Neutrino 和 joy

    Using Webpack for the First Time

    • webpack 只做 barebones,帮助用户定制工作流
    • 使用 npm 脚本封装如 webpack 这样的二进制命令

    Adding npm Scripts for Environment Builds

    • webpack 4+ 零配置
    • 为工作流定制环境:开发、线上、构建、调试

    Setting Up Debugging

    • node --inspect --debug-brk
    "debug":"node --inspect --inspect-brk ./node_modules/webpack/bin/webpack.js",
    "dev:debug":"npm run debug -- --env.mode development"
    

    Coding Your First Module

    Adding Watch Mode

    ES Module Syntax

    • Webpack中 会解析出一个依赖图

    CommonJS Export

    • Webpack 支持使用 require,但强烈支持不要尽可能多地使用 CommonJS
    • 像 Bable 和 Typescript 这样的工具可以安全地默认在后台将ESM转换为 CommonJS,然后将其传递给 Webpack。

    CommonJS Named Exports

    • 建议将导出保留在文件的底部
    • 使用命名参数而不仅仅是模块或模块点导出

    Tree Shaking

    • 增量编译

    Webpack Bundle Walkthrough 重要

    • 编译后的每个模块都是 IIFE
    • 会预置一段运行时代码,首先是 installedModules,它是一个模块缓存
    • 还有一个名为 webpack_require 的函数,这就是 require 函数,它需要一个模块 ID 参数,返回 .exports
    • 找到模块后会调用 .call 方法
    • 这个过程叫做动态绑定,为了避免循环依赖,会对对象进行冻结
    • 第一个模块在最后一行被调用,不是 IIFE

    Webpack Entry

    • 依赖的切入点
    • 与 output 属性搭配使用

    Output & Loaders

    • output 告诉 Webpack 在哪里以及如何分发这些文件
    • loader 需要规则集,从而匹配和转换文件
    • loader 可以组合使用

    Chaining Loaders

    • 总是从右到左执行,类似一个组合函数

    Webpack Plugins

    • 它只是一个实例。它是一个 JavaScript 对象,在原型链中有一个 apply 属性。它允许您挂钩整个事件的 Webpack 生命周期。
    • 通过监听事件来根据数据的内容进行一些操作。
    • 记得使用的时候 new 一下
    • 80% 的 Webpack 源代码都是由这些插件组成的。Webpack 本身是一个完全由事件驱动的架构。

    Webpack Config

    • webpack 可以接受一个对象,作为配置模块的默认导出,但它也可以使用一个返回对象的函数。

    Passing Variable to Webpack Config

    • 三套配置
    npm run webpack -- --env.mode production
    

    Adding Webpack Plugins

    • 以 html-webpack-plugin 做例子

    Setting Up a Local Development Server

    • 以 webpack-dev-server 为例,是基于 Express 的 Web 服务器。只不过写到内存里。

    Starting to Code with Webpack

    随便写了点代码

    Splitting Environment Config Files

    • webpack-merge 合并
    • 在创建 JavaScript 模块时可以对其进行哈希处理,比如说 chunckhash

    Webpack Q&A

    • webpack-dev-server 可以进行服务端开发吗?

    实际上是 webpack-dev-middleware,当然可以

    • 有没有办法利用多个模板的 HTML webpack 插件?

    实际上是多页应用程序架构:multipage-webpack-plugin?为每个条目创建一个新的 html-webpack-plugin 插件实例。

    • 是否存在 webpack 进程遇到内存不足错误以及捕获该异常的情况?

    webpack 性能的空间复杂度和模块是线性的,所以需要很多内存。webpack 5 会有一些缓存。如果出现内存泄漏就加哈希。

    Using CSS with Webpack

    • 传统的方法是在磁盘文件夹中提供它并在 style 标记中引用。
    • 需要一个合适的加载器来处理这个文件:css-loader

    Hot Module Replacement with CSS

    • Webpack 具有以下功能:能够对以增量方式进行的更改进行修补,并在不必重新加载浏览器的情况下应用它们。
    • mini-css-extra 插件可以将 css 提取到一个文件里
    • 代码拆分 CSS 时,将它们分成异步应用程序变得很有价值。所以 CSS 模块出现了。

    File Loader & URL Loader

    • 将媒体资源转换成 base64

    Loading Images with JavaScript

    Limit Filesize Option in URL Loader

    • 各种图像

    Implementing Presets

    • 添加一个预设系统,不仅仅是开发和生产环境
    • 有时,肖恩称他们为附加组件。你可以随意调用它。通过传 env 来取出预设选项
    • 将若干个预设选选项对应的配置合并:applyPresets
    const webpackMerge = require("webpack-merge");
    
    const loadPresets = (env = { presets: [] }) => {
      const presets = env.presets || [];
    
      const mergedPresets = [].concat(...[presets]);
      const mergedConfigs = mergedPresets.map(presetName => {
        return require(`./presets/webpack.${presetName}`)(env);
      });
    
      return webpackMerge({}, ...mergedConfigs);
    };
    
    module.exports = loadPresets;
    

    Bundle Analyzer Preset

    • 当 webpack 构建时,它会发出这个 stats 对象。stats 对象要么转换为字符串,要么转换为 JSON
    • WebpackBundleAnalyzer 插件可视化分析

    Compression Plugin

    • 压缩所有资产成 gzip

    Source Maps

    • 可以通过多种不同的方式生成源映射
    • devtool 是负责创建源映射的属性。
    • sourcemap 有不同的质量:快慢轻重
    • 可以做调试驱动的开发
    • 常见的有 source-map、cheap-module-source-map、eval 等

    Q&A and Closing Remarks

    • 如何避免打包文件过大?

    代码拆分、关闭缓存、懒加载等。

    • 摇树在 output 独立的函数而不是 class 时都会受益吗?

    只需使用 ESM 即可获得依赖注入。所以与导出整个类相比,最好是导出单个函数和值以及基元。

    • 如何找到好插件和坏插件?

    Webpack-Contrib,以及看 github 的 pr 和 issue 处理程度

    相关文章

      网友评论

          本文标题:frontendmasters webpack-fundamen

          本文链接:https://www.haomeiwen.com/subject/zpfcxqtx.html