# webpack的基本用法:核心概念

webpack是一个JavaScript应用程序的静态模块打包器(module bundler)。当webpack处理 应用程序时,会从命令行或配置文件中定义的一个模块列表开始处理应用,以这些入口起点(entry)开始, 会递归地构建一个依赖关系图,由于文件间的依赖关系,这使得webpack可以接受例如图片、 字体图标等非代码资源作为依赖来提供给应用程序,然后将应用程序需要的所有模块打包成一个 或多个可有浏览器加载的bundle。

# 入口起点:entry

entry是用来指定webpack的打包入口的,即依赖图的入口。
可通过webpack配置中配置entry属性来指定一个或多个入口起点。默认值为./src。

# 单入口

单入口时,entry接受一个字符串,一般适用于构建单页应用。
单入口的写法,webpack.dev.js

const config = {
  entry: './path/to/my/entry/file.js'
};

module.exports = config;

# 多入口

多入口时,entry接受一个对象,一般适用于构建多页应用
多入口的写法,webpack.dev.js

const config = {
  entry: {
    app: './src/app.js',
    vendors: './src/vendors.js'
  }
};

# 输出:output

相对于entry来对于的源码来说,output就是告诉webpack如何将编译后的文件输出到硬盘。 其中需要指明的时只能由一个output输出配置。

# output属性

  • filename:输出文件的文件名
  • path:目标输出目录的绝对路径

# 单入口的output用法

对于单入口时,output可直接指定对应的filename和路径即可。
webpack.dev.js

const config = {
  output: {
    filename: 'bundle.js',
    path: '/home/proj/public/assets'
  }
};

# 多入口的output用法

对应于多个entry来说,由于output只能配置一项,所以需要通过占位符来确保文件名称的唯一性。

{
  entry: {
    app: './src/app.js',
    search: './src/search.js'
  },
  output: {
    filename: '[name].js',
    path: __dirname + '/dist'
  }
}

// 写入到硬盘:./dist/app.js, ./dist/search.js

demo的代码地址:https://github.com/PCAaron/blogCode/tree/master/webpack/webpack-multi

运行结果:
webpack多入口打包output

# loader

webpack开箱即用只支持JS和JSON两种文件类型,通过loader,可实现支持其他类型文件,例如 css预编译器、JSX、内联图片转dataURL等转化为有效的模块并添加到依赖图中。

loader本身时一个函数,接受源文件作为参数。

# loader的用法

推荐在webpack.config.js文件中module.rules配置项中指定loader。例外亦可通过import语句内联 或shell命令中指定。

其中,rules有两个配置属性:

  • test属性,用于匹配规则。
  • use属性,指定使用的loader名称。

webpack.dev.js

module.exports = {
  module: {
    rules: [
      { test: /\.css$/, use: 'css-loader' },
      { test: /\.ts$/, use: 'ts-loader' }
    ]
  }
};

# 常用的loader

名称 描述
babel-loader 转换ES6+等JS新特性语法
ts-loader 将TS转换成JS
css-loader 支持.css文件的加载和解析
style-loader 将css代码注入到JS中
less-loader 将less文件转换成css
file-loader 进行图片、字体等的打包
url-loader 将小文件以base64的方式注入到代码中
raw-loader 将文件以字符串的形式导入
thread-loader 多进程打包JS和CSS

# 插件:plugins

plugins作用于bundle文件的优化,资源管理和环境变量注入。目的在于解决loader无法实现的其他事。

webpack的plugins是一个具有apply属性的JS对象。apply属性会被webpack compiler调用, 所以plugins可以作用于构建过程的整个过程。

# plugins的用法

由于plugins可以携带参数/选项,所以需在 webpack 配置中,向 plugins 属性传入 new 实例。
webpack.dev.js

module.exports = {
    plugins: [
        new HtmlWebpackPlugin({
            template: './src/index.html'
        })
    ]
}

# 常用的plugins

名称 描述
CommonsChunkPlugin 将chunks相同的模块代码提取成公共js
CleanWebpackPlugin 清空构建目录
ExtractTextWebpackPlugin 将CSS从bunlde文件里提取成一个独立的CSS文件
CopyWebpackPlugin 将文件或者文件夹拷贝到构建的输出目录
HtmlWebpackPlugin 创建html文件去承载输出的bundle
UglifyjsWebpackPlugin 压缩JS
ZipWebpackPlugin 将打包出的资源生成一个zip包

# 模式:mode

mode配置选项,是用来指定当前的构建环境是production、development还是none。是4.0后 才引入的配置。

通过mode参数可以自动的触发webpack响应模式下的内置优化,默认值为production。

# mode的内置函数功能

名称 描述
development 会将process.env.NODE_ENV的值设为development。启动NamedChunksPlugin和NamedModulesPlugin。
production 会将 process.env.NODE_ENV 的值设为 production。启用 FlagDependencyUsagePlugin, FlagIncludedChunksPlugin, ModuleConcatenationPlugin, NoEmitOnErrorsPlugin, OccurrenceOrderPlugin, SideEffectsFlagPlugin 和 UglifyJsPlugin。
none 不启动任何优化选项

# mode的用法

mode推荐在webpack配置中使用
webpack.dev.js

module.exports = {
    mode: 'production'
}

亦可通过CLI参数设置

webpack --mode=production