Webpack| 青训营笔记

92 阅读3分钟

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

一、什么是WebPack

一个前端项目,通常是由非常多的资源构成。图片,js,css,JSX...都可以成为一个前端项目的资源。如何管理这些资源成为了一个难题。大概在10年前,我们会在html中手动指定资源文件路径来手动管理资源文件。但是,手动管理资源会有很多不方便的地方。比如

  • 存在大量资源时插入,修改资源链接过程繁琐
  • 资源文件存在依赖时,必须严格按照顺序书写
  • 开发环境与生产环境一致,难以使用TS,JS新特性
  • JS,图片,CSS资源管理模型不一致

这些问题对于开发效率,开发规模都有非常大的影响。为了解决这些存在的问题,我们需要一个资源管理、打包、编译的工具。Webpack就是这样一个资源编译、打包工具。

二、使用Webpack

示例

安装Webpack

通过NodeJs软件包管理工具npm 我们可以很轻松地安装Webpack。使用npm i - D webpack webpack-cli来安装WebPack。

编辑配置文件

下面是一个简单的配置文件示例

const path = require('path');

module.exports = {
  entry: './src/main.js',
  output: {
    path: [name].js,
    filename: path.join(__dirname, './dist')
  }
};

我们会在下面的章节中详细介绍配置文件。

执行编译命令

使用npx webpack就可以按照配置文件的内容来编译、打包前端项目。

WebPack 配置

Webpack的配置大致可以分为两类

  • 流程类:作用于流程中某个或者若干个环节,直接影响打包效果
  • 工具类:主流程之外,提供更多的工程化能力

流程类配置

流程类配置由输入、模块解析、输出、后处理组成,下面会分别举例介绍各部分的配置方法。

  • 输入

    使用entry可以指定项目的入口文件。

entry: './src/main.js',
  • 模块解析 使用resolve于配置模块如何被解析。 resolve 是一个对象,里面有非常多属性,这里我们只看两个比较常见的属性。
    • resolve.extensions

      示例:

resolve:{ extensions:['.js','.jsx','.ts','.tsx'] }

Webpack在处理import时,如果没有加扩展名,会根据extensions中的扩展名顺序去寻找要import的文件。

  • resolve.alias

    示例:

resolve:{ alias:{ utils:path.resolve(__dirname,'./a complex path/utils') } }

配置了alisa之后,我们就可以直接使用 import utils 来代替原来十分复杂的路径。

  • 模块转译

    我们可以使用module来处理外部资源。

    处理CSS示例:

module:{
    rules:[
      {
        test:/\.css$/,
        use:['style-loader','css-loader']
      }
    ]
}

首先使用test选项来匹配需要处理的文件,然后使用use来定义处理这种文件的loader序列。

  • 后处理

    示例:

mode:  'development'

使用mode可以指定Webpack使用相应模式的内置优化,一般有development和production两个选项。 使用development选项一般不会对代码进行优化,而使用production选项则会对代码进行去除没有使用的模块等优化。

工具类配置

工具类配置一般会在流程类配置之前进行处理。工具类配置主要是为了提高开发效率或者是优化编译过程而存在。比如Webpack内置了tree-shaking工具,只要使用production mode,并且配置了optimization.usedExports : true就会自动去除代码中没有被使用的代码或模块。