webpack安装 loader和plugin配置 和打包测试

55 阅读2分钟

webpack 是静态模块打包器,当 webpack 处理应用程序时,会将所有这些模块打包成一个或多个文件

webpack 可以处理 js/css/图片、图标字体等单位

开发过程中存在于本地的 js/css/图片/图标字体等文件,就是静态的

动态的内容,webpack 没办法处理,只能处理静态的

使用步骤

  1. 初始化项目
  2. 安装需要的包
  3. 配置 webpack
  4. 打包并测试

初始化项目后,webpack的配置写在webpack.config.js文件里

loader

官方 loader: www.webpackjs.com/loaders/

webpack 本身只能处理 js, 不能处理 css 和图片 loader 可以让 webpack 去处理那些非 JS 文件的模块

babel-loader

babel 和 webpack 配合, 把 ES6 编译成 ES3, ES5 代码, 以提高兼容性

babel 负责编译, webapck 负责打包

babel-loader, 负责连通 babel 和 webpack, 真正起到编译作用的是 babel

安装bable npm install --save-dev @babel/core@7.11.0 @babel/preset-env@7.11.0

新建 babel.config.json,配置 babel,

{
	"presets": ["@babel/preset-env"]
}

安装 babel-loader npm install --save-dev babel-loader@8.1.0

使用bable-loader

module: {
定义规则, 使用数组的原因: 可能有很多的loader, 每个loader 都可以单独配置
rules: [
	{
	test: /\.js$/, // 正则表达式, 文件夹下的所有js文件, 都会查找到并编译
	exclude: /node_modules/, // 排除某些文件夹, 里面的js不需要编译
	loader: "babel-loader", // 使用的loader名称
	},
      ],
    },

增强 babel 编译功能

先安装npm install --save-dev core-js@3.6.5

安装好以后,在要打包的js中引入 import "core-js/stable";

修改 index.html, 在 IE 中测试兼容性

插件 plugins

loader 被用于帮助 webpack 处理各种模块,而插件则可以用于执行范围更广的任务

每个插件的功能都不同, 具体插件, 具体分析

官方插件: www.webpackjs.com/plugins/

HtmlWebpackPlugin

自动生成新的 html 文件, 包括已经编译好的 js 放在输出文件夹下, 将来上线只需要上传输出文件夹里面的文件即可

先安装npm install --save-dev html-webpack-plugin@4.3.0

在webpack中导入插件 `var HtmlWebpackPlugin = require("html-webpack-plugin

配置插件

 // 配置插件
	plugins: [
		new HtmlWebpackPlugin({
			template: "./index.html",
		}),
	],

如果有多个入口文件js,并且需要生成多个html,每个html里面有自己对应的js,那么插件配置如下:

plugins: [
        // 使用的时候,先实例化,
	new HtmlWebpackPlugin({
         // 生成的html文件使用的模板
	template: "./index.html",
         // 生成的html
       filename:"index.html",
       // 每个html里面对应的js
      chunks:["index"],
      //HtmlWebpackPluginf的其他配置
        minify: {
	// 删除 index.html 中的注释
	removeComments: true,
	// 删除 index.html 中的空格
	collapseWhitespace: true,
	// 删除各种 html 标签属性值的双引号
	removeAttributeQuotes: true,
	},
	}),
	
        new HtmlWebpackPlugin({
        // 生成的html文件使用的模板
	template: "./search.html",
      // 生成的html
        filename:"search.html",
       chunks:["search"],
        //HtmlWebpackPluginf的其他配置
        minify: {
	// 删除 index.html 中的注释
	removeComments: true,
	// 删除 index.html 中的空格
	collapseWhitespace: true,
	// 删除各种 html 标签属性值的双引号
	removeAttributeQuotes: true,
	},
	}),
],

完整代码如下

// 配置webpack
const path = require("path")
// 插件安装好以后导入,HtmlWebpackPlugin用来在出口文件下自动生成新的 html 文件, 包括已经编译好的 js
// 放在输出文件夹下, 将来上线只需要上传输出文件夹里面的文件即可
var HtmlWebpackPlugin = require("html-webpack-plugin");
const { chunk } = require("lodash");
module.exports = {
    // 模式设置,把打包后的静态压缩文件变成能看懂的开发模式下的代码
    mode:"development",
    // 入口文件,webpack从哪个文件入手进行打包
    // entry:"./src/index.js",
    // 也可以定义多入口
    entry:{
        index:"./src/index.js",
        search:"./src/search.js",

    },
    // 出口文件,打包完成后的静态文件放哪里,打包好的文件可以直接在其他地方引入使用
    output:{
        // 路径必须是绝对路径,path.resolve用来拼接路径,这里用到了path,要提前引入
        path:path.resolve(__dirname,"dist"),
        // 单出口,用来生成打包后的js
        // filename:"bundle.js",
        // 如果是多入口,就要设置多出口来接收
        filename:"./script/[name].js",
    },
    // webpack本身只可以打包js文件,使用loader来帮助webpack处理其他非js文件
    module: {
		// 定义规则, 使用数组的原因: 可能有很多的loader, 每个loader 都可以单独配置
		rules: [
			{
				test: /\.js$/, // 正则表达式, 文件夹下的所有js文件, 都会查找到并编译
				exclude: /node_modules/, // 排除某些文件夹, 里面的js不需要编译
				loader: "babel-loader", // 使用的loader名称
			},
		],
	},
    // 配置插件
	plugins: [
        // 使用的时候,先实例化,
		new HtmlWebpackPlugin({
            // 生成的html文件使用的模板
			template: "./index.html",
            // 生成的html
            filename:"index.html",
            // 每个html里面对应的js
            chunks:["index"],
            minify: {
				// 删除 index.html 中的注释
				removeComments: true,
				// 删除 index.html 中的空格
				collapseWhitespace: true,
				// 删除各种 html 标签属性值的双引号
				removeAttributeQuotes: true,
			},
		}),
		new HtmlWebpackPlugin({
            // 生成的html文件使用的模板
			template: "./search.html",
            // 生成的html
            filename:"search.html",
            chunks:["search"],
            minify: {
				// 删除 index.html 中的注释
				removeComments: true,
				// 删除 index.html 中的空格
				collapseWhitespace: true,
				// 删除各种 html 标签属性值的双引号
				removeAttributeQuotes: true,
			},
		}),
	],

}