webpack初了解 | 青训营笔记

88 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第四天

为什么要webpack

非常复杂的东西

  1. 前端工程化的概念、工具、目标
  2. 个人的核心竞争力
  3. 高阶前端的必经之路

什么是webpack

  1. 前端是由一大堆文件组成的:js、css、html、字体、图片……

  2. 古早时代里,依赖手工、需要按照依赖顺序书写、难以接入TS或者JS、难以接入Less、Sass,资源管理模型不统一

  3. 让我想到了我的p5js……好像就是这样的

  4. 前端资源编译、打包工具:

    1. 多份资源打包成一个bundle

    2. 支持Babel、Eslint、TS、coffeScript、Less、Sass

    3. 支持模块化处理CSS、图片等资源

    4. 支持HMR+开发服务器

    5. 支持持续监听、持续构建

    6. 支持代码分离

      ……

工程化工具:gulp、webpack、rollup、vite

使用webpack

基础步骤:

  1. 安装webpack
  2. 编辑配置文件
  3. 打包

配置文件:

存在一个entry与一个output

非常复杂,以至于为人诟病

核心流程:

  1. 入口处理:从entry文件开始编译流程
  2. 依赖解析:从entry开始,根据require与import找到依赖源
  3. 资源解析:根据module配置,调用资源转译器,将png、css等非JS资源转译为JS内容
  4. 资源合并打包:将转译后的资源合并打包为js文件

特性:

  1. 模块化
  2. 一致性

案例

  • 流程配置:作用于流程的某个or若干个环境、直接影响打包效果的配置项
  • 工具配置:主流程外,提供更多工程化能力的配置项
  1. 流程:

    1. 输入: entry、context
    2. 模块解析: resolve、externals
    3. 模块转译: module
    4. 后处理: optimization、mode、target
  2. 工具

    1. 开发效率类:watch、devtools
    2. 性能优化类: cache、performance
    3. 日志类: stats、infrastructureLogging
流程向
  1. 接入babel

    const path = require('path')
    ​
    module.exports = {
      entry: './src/index',
      output: {
        path: path.join(__dirname, './dist'),
        filename: '[name].js'
      },
      module: {
          rules:[{
              test: /.js?$/,
              use:[{
                  loader: 'babel-loader',
                  options: {
                      presets:[
                          [
                              '@babel/preset-env'
                          ]
                      ]
                  }
              }]
          }]
      }
    }
    
  2. 接入CSS

  3. 接入HTML

工具向
  1. HMR
  2. fada
loader

webpack只认js

所以需要使用loader来解决这个问题

链式调用:

  • less-loader
  • css-loader
  • style-loader

总结:

前端作为一个诸多交叉的领域,是需要一个强有力的工程化工具来提高生产效率,而webpack,就担任了这个角色