webpack的一些基本配置和一些常用的loader、plugin

目录

一、webpack的默认打包

二、webpack的配置文件—webpack.config.js

三、指定配置文件

四、webpack的依赖图

五、loader的使用

1.使用场景

2.使用方案

3.配置方式

4.常用的loader

4.1 css-loader

4.2 style-loader

4.3 less-loader

六、browserslist工具

1.浏览器查询过程

2.Browserslist编写规则

3.Browserslist的使用

3.1 命令行使用browserslist

3.2 配置browserslist

4.默认配置和条件关系

七、PostCSS工具

1.定义

2.使用

2.1 在命令行使用

2.2 在webpack单独使用

八、plugin的使用

1.官网描述

2.常用的plugin

2.1 CleanWebpackPlugin

2.2 HtmlWebpackPlugin

2.3 DefinePlugin

2.4 CopyWebpackPlugin


一、webpack的默认打包

在目录下直接执行 webpack 命令,然后就会生成一个dist文件夹,里面存放一个main.js的文件,就是我们打包之后的文件。当我们运行webpack时,webpack会查找当前目录下的 src/index.js作为入口。

webpack

我们也可以通过配置来指定入口和出口:

npx webpack --entry ./src/main.js --output-path ./build

二、webpack的配置文件—webpack.config.js

在通常情况下,webpack需要打包的项目是非常复杂的,并且我们需要一系列的配置来满足要求,默认配置必然是不可以的。在根目录下创建一个webpack.config.js文件,来作为webpack的配置文件:

const path = require('path')

module.exports = {
  entry: "./src/main.js",
  output: {
    filename: "bundle.js",
    // 必须为绝对路径
    path: path.resolve(__dirname, "./build") // __dirname为当前文件所在的目录的绝对路径
  }
}

三、指定配置文件

如果我们的配置文件并不是webpack.config.js的名字,比如我们将webpack.config.js修改成了 wk.config.js,个时候我们可以通过 --config 来指定对应的配置文件:

webpack --config wk.config.js

四、webpack的依赖图

如果我们的配置文件并不是webpack.config.js的名字,比如我们将webpack.config.js修改成了 wk.config.js,个时候我们可以通过 --config 来指定对应的配置文件:

五、loader的使用

1.使用场景

问题:当我们想要给一些元素添加样式文件,我们创建了一个css文件,并在需要用到的地方进行引入,这时这个css文件已产生依赖。但我们在打包的时候会发生报错。

上面的错误信息告诉我们需要一个loader来加载这个css文件。

loader是用于对模块的源代码进行转换,在加载css这个模块时,webpack其实并不知道如何对其进行加载,我们必须制定对应的loader来完成这个功能。

2.使用方案

  •  内联方式(在引入的样式前加上使用的loader,并且使用!分割)
import "css-loader!../css/index.css";
  • 配置方式

3.配置方式

module.rules中允许我们配置多个loader,这种方式可以更好的表示loader的配置,也方便后期的维护,同时也让你对各个Loader有一个全局的概览。

module.rules的配置如下:

  • rules属性对应的值是一个数组:[Rule]

  • 数组中存放的是一个个的Rule,Rule是一个对象,对象中可以设置多个属性:

    • test属性:用于对 resource(资源)进行匹配的,通常会设置成正则表达式;

    • use属性:对应的值时一个数组:[UseEntry]

      • UseEntry是一个对象,可以通过对象的属性来设置一些其他属性

        • loader:必须有一个 loader属性,对应的值是一个字符串;

        • options:可选的属性,值是一个字符串或者对象,值会被传入到loader中;

        • query:目前已经使用options来替代;

      • 传递字符串(如:use: [ 'style-loader' ])是 loader 属性的简写方式(如:use: [ { loader: 'style-loader'} ]);

    • loader属性: Rule.use: [ { loader } ] 的简写。

module.exports = {
  entry: "./src/main.js",
  output: {
    filename: "bundle.js",
    // 必须为绝对路径
    path: path.resolve(__dirname, "./build") // __dirname为当前文件所在的目录的绝对路径
  },
  module: {
    rules: [
      {
        // 正则表达式
        test: /\.css$/, // 对资源进行匹配
        use: [ // loader的执行顺序是从下到上,从右到左
          {loader: "style-loader"}
          {loader: "css-loader"} // 写法一
        ],
        // use: ["style-loader", "css-loader"] // 写法二
        // loader: "css-loader" // 写法三
      }
    ]
  }
}

4.常用的loader

4.1 css-loader

作用:负责将.css文件进行解析

局部安装

npm install -D css-loader

补充:css-loader的importLoaders属性

{
  test: /\.css$/, // 匹配资源
  use: [
    "style-loader", 
    {
      loader: "css-loader",
      options: {
        importLoaders: 1 // 数量表示前面有多少个loader需要运行
      }
    },
    "postcss-loader"
  ],
},

4.2 style-loader

作用:插入style的操作

npm install -D style-loader

4.3 less-loader

作用:自动使用less工具转换less到css

npm install less-loader -D

六、browserslist工具

问题:现在有一个问题,我们如何可以在css兼容性和js兼容性下共享我们配置的兼容性条件呢?

回答:我们是通过工具来达到这种兼容性的,例如postcss-prest-env、babel、autoprefixer。

Browserslist是什么?

Browserslist是一个在不同的前端工具之间,共享目标浏览器和Node.js版本的配置

1.浏览器查询过程

这些工具会根据我们的配置来获取相关的浏览器信息,以方便决定是否需要进行兼容性的支持。条件查询使用的是caniuse-lite的工具,这个工具的数据来自于caniuse的网站上。

2.Browserslist编写规则

 

 

3.Browserslist的使用

3.1 命令行使用browserslist

我们可以直接通过命令来查询某些条件所匹配到的浏览器:

npx browserslist ">1%, last 2 version, not dead"

3.2 配置browserslist

  • 方案一:package.json配置:

        

  •  方案二:.browserslistrc文件

        

4.默认配置和条件关系

如果没有配置,那么也会有一个默认配置:

 我们编写了多个条件之后,多个条件之间是什么关系呢?

七、PostCSS工具

1.定义

PostCSS是一个通过JavaScript来转换样式的工具,这个工具可以帮助我们进行一些CSS的转换和适配,比如自动添加浏览器前缀、css样式的重置,但是实现这些工具,我们需要借助于PostCSS对应的插件

2.使用

  • 第一步:查找PostCSS在构建工具中的扩展,比如webpack中的postcss-loader;

  • 第二步:选择可以添加需要的PostCSS相关的插件;

2.1 在命令行使用

如果要在命令行中使用,我们需要单独安装一个工具postcss-cli

npm install -D postcss postcss-cli

如果我们需要编写一个添加前缀的css,那么需要再安装一个autoprefixer插件

npm install -D autoprefixer

直接使用postcss工具,并且指定使用autoprefixer

npx postcss --use autoprefixer -o result.css ./src/css/style.css

上面的命令行语句的意思就是使用postcss,并指定是autoprefixer插件,然后将指定目录下的css文件转化(./src/css/style.css),并输出为转化后目标文件(result.css)

2.2 在webpack单独使用

真实开发中我们必然不会直接使用命令行工具来对css进行处理,而是可以借助于构建工具,在webpack中使用postcss就是使用postcss-loader来处理的。

npm install -D postcss-loader
{
  // 正则表达式
  test: /\.css$/, // 对资源进行匹配
  use: [
    {loader: "css-loader"},
    {
     loader: "postcss-loader",
     options: {
       postcssOptions: {
         plugins: [
          require('autoprefixer')
         ]
       }
      }
    }
  ],
}

注意:因为postcss需要有对应的插件才会起效果,所以我们需要配置它的plugin;

2.2.1 单独的postcss配置文件

postcss-preset-env插件

在配置postcss-loader时,我们配置插件并不需要使用autoprefixer,我们可以使用另外一个插件:postcss-preset-env,它可以帮助我们将一些现代的CSS特性,转成大多数浏览器认识的CSS,并且会根据目标浏览器或者运行时环境添加所需的polyfil,也包括会自动帮助我们添加autoprefixer。

npm install -D postcss-preset-env

我们也可以将这些配置信息放到一个单独的文件中进行管理:

在根目录下创建postcss.config.js

八、plugin的使用

1.官网描述

While loaders are used to transform certain types of modules, plugins can be leveraged to perform a wider range of tasks like bundle optimization, asset management and injection of environment variables.

翻译:Loader是用于特定的模块类型进行转换,Plugin可以用于执行更加广泛的任务,比如打包优化、资源管理、环境变量注入等。

2.常用的plugin

2.1 CleanWebpackPlugin

每次修改了一些配置,重新打包时,都需要手动删除dist文件夹,现在我们CleanWebpackPlugin插件帮我们自动删除。

配置:

const {CleanWebpackPlugin} = require('clean-webpack-plugin')

module.exports = {
	plugins: [
		new CleanWebpackPlugin()
	]
}

2.2 HtmlWebpackPlugin

如果我们想要打包文件自动生成入口文件index.html,那么可以使用HtmlWebpackPlugin插件。

配置:

const {CleanWebpackPlugin} = require('clean-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
	plugins: [
		new CleanWebpackPlugin(),
		new HtmlWebpackPlugin({
			title:"webpack test"
		})
	]
}

生成index.html文件的过程:在html-webpack-plugin的源码中,有一个default_index.ejs模块,默认情况下是根据ejs的一个模板来生成的。如果我们想在自己的模块中加入一些比较特别的内容,比如添加一个noscript标签,在用户的JavaScript被关闭时,给予响应的提示,比如在开发vue或者react项目时,我们需要一个可以挂载后续组件的根标签 <div id="app"></div>,我们可以设置一个自己的index.html模版。

比如vue里的html模版:

配置:  

const {CleanWebpackPlugin} = require('clean-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
	plugins: [
		new CleanWebpackPlugin(),
		new HtmlWebpackPlugin({
			title:"webpack test",
			template: "./public/index.html" // 指定某个目录下的某个文件作为模版html
		})
	]
}

但是,这个时候编译还是会报错,因为在我们的模块中还使用到一个BASE_URL的常量,在编译template模块时,有一个BASE_URL:<link rel="icon" href="<%= BASE_URL %>favicon.ico">;我们没有设置这个常量值,所以抛出这个错误,这是我们可以使用插件DefinePlugin。

2.3 DefinePlugin

 DefinePlugin允许在编译时创建配置的全局常量,是一个webpack内置的插件(不需要单独安装)

配置:

const {CleanWebpackPlugin} = require('clean-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const {DefinePlugin} = require('webpack')

module.exports = {
	plugins: [
		new CleanWebpackPlugin(),
		new HtmlWebpackPlugin({
			title:"webpack test",
			template: "./public/index.html" // 指定某个目录下的某个文件作为模版html
		}),
		new DefinePlugin({
			BASE_URL: '"./"' // 注意是一个字符串的形式赋值给BASE_URL,例如 const BASE_URL = "./"
		})
	]
}

2.4 CopyWebpackPlugin

在vue的打包过程中,如果我们将一些文件放到public的目录下,那么这个目录会被复制到dist文件夹中,这个复制的功能,我们可以使用CopyWebpackPlugin来完成。

配置:

const {CleanWebpackPlugin} = require('clean-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const {DefinePlugin} = require('webpack')
const CopyWebpackPlugin = require('copy-webpacklugin')

module.exports = {
	plugins: [
		new CleanWebpackPlugin(),
		new HtmlWebpackPlugin({
			title:"webpack test",
			template: "./public/index.html" // 指定某个目录下的某个文件作为模版html
		}),
		new DefinePlugin({
			BASE_URL: '"./"' // 注意是一个字符串的形式赋值给BASE_URL,例如 const BASE_URL = "./"
		})
		new CopyWebpackPlugin({
			patterns: [
				{
					from: "public",
					globOptions: { // 复制的规则在patterns中设置
						ignore: [ // 忽略某些文件,不被复制
							'**/index.html',
							'**/DS_Store' // mac目录下回自动生成的一个文件
						]
					}
				}
			]
		})
	]
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值