webpack从0入门(1)

771 阅读4分钟

1 常见概念解释

  • Entry: 入口:Webpack 执行构建的第一步将从 Entry 开始,可抽象成输入(可以有多个入口 )。
  • Output: 输出:输出结果,在 Webpack 经过一系列处理并得出最终想要的代码后输出结果。
  • Module: 模块,在 Webpack里一切皆模块,一个模块对应着一个文件(插件的本质也只是1个文件,从插件的入口文件再去找插件所依赖的模块)。Webpack 会从配置的 Entry 开始递归找出所有依赖的模块。
  • Chunk: 代码块,一个 Chunk 由多个模块组合而成,用于代码合并与分割(主要是代码分割)。
  • Loader: 模块转换器,用于把模块原内容按照需求转换成新内容。(例如less-loader)
  • resolve: 为文件解析定义规则
  • Plugin: 扩展插件,使用一些插件来完成对应的工作

2 常用参数

1. Entry常用参数

参数名 意义 常见值
context 打包时根目录的位置 path.resolve(__dirname, 'app')
vendor 依赖的第三方库 [ (插件名) ]
入口type 如果为字符串或数组为单入口,对象则为多入口

2. Output输出

output最终结果是一个object,如果是别的数据类型会报错。

参数名 意义 备注
filename 打包后文件名 必要,没有会报错
path 打包后路径 必要,没有会报错,文件名没有会创建文件
library 输出文件以什么暴露 例如vue打包暴露的全局名称为Vue就是在这配置的
libraryTarget 文件暴露方式 默认值'var' 但是常见框架用的是'umd'

这里详解下libraryTarget,他允许的值有以下:

参数名 意义 备注
var 打包后用一个申明变量接受 默认
assign 打包后用一个未申明变量接受 可能会会覆盖全局变量
this 挂载在this上 这个this可以使window
window 挂载在window上 挂载在window上,例如地图AMap,但要确保存在window
global 挂载在指定全局对象上
commonjs 库将通过 CommonJS 规范导出。 只能用exports导出
commonjs2 库将通过 CommonJS2 规范导出。 例如vue打包暴露的全局名称为Vue就是在这配置的
amd AMD模式 requir..define的引入模式
umd 这个选项会尝试把库暴露给前使用的模块定义系统 说白了就是兼容模式,你怎么引入都没错

常见插件vue,react等都是用的umd,这也是先这段代码的来源

如果你也想尝试进行插件封装,那么打包输出方式首选umd

3.Loader

你在代码中写的.vue文件,.jsx文件之所以最后都能变成.js文件,less,scss文件能变成.css文件都是loader的功劳,其中需要注意的包括:

  • 1.use 属性的值需要是一个由 Loader 名称组成的数组,Loader 的执行顺序是由后到前的;
  • 2.每一个 Loader 都可以通过 URL querystring 的方式传入参数,例如 css-loader?minimize 中的 minimize 告诉 css-loader 要开启 CSS 压缩。

4.resolve

常用参数:

    1. resolve.alias:别名,方便引入比如你的img文件经常要引用,但是前面的路径又很长,写起来非常费劲那你可以尝试这样:
alias:{
    "@img":"path.resolve(__dirname, './src/xxx/xxx/xxx/xxx/xxx/xxx/img'),"</br>
}

这时你的引入只需要import a from "@img/a.png"

  • 2.resolve.extensions (array) 拓展,这就意味着 webpack 将不再尝试使用默认扩展来解析模块。对于使用其扩展导入的模块
    这常用于一个插件,例如cdn引入的插件,想用import xxx from XXX,或者在vue中引入jq等需求都可以在这里解决
    就可以在这里将全局变量在这里命名
externals:{
    '$': '$',
},

5.Plugin

个人认为webpack强大之处就在于其庞大的生态系统,各种各样的插件可以满足你的一切需求,只要找到对应的API,安装后进行对应的配置,就可以实现对应功能,所以这里的难点在于你到底需要什么插件,这个插件应该怎么配置,而不是这个插件咋接入webpack。顺带提一句,plugins接受的是一个数组,数据类型错了可是会报错的哟!

const TerserPlugin = require("terser-webpack-plugin");

plugins:[(
    new ZipPlugin({
        path: path.join(__dirname, 'dist'),
        filename: 'dist.zip',
        exclude: [/\.map$/]
      }),
)]