webpack 自用笔记

        本 质上,webpack是一个现代 JavaScript 应用程序的 静态模块打包器(module bundler) 。

        当 webpack 处理应用程序时,它会递归地构建一个 依 赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle 。

安装

md mypack
//新建文件夹

cd mypack
// 进入你的项目目录 mypack目录可以随意自己建立

npm init  
//  初始化项目文件夹 会创建一个package.js

//本地安装
npm install --save-dev webpack
npm install --save-dev webpack-cli

准备文件

-- dist 文件生成目录
---- index.html 

-- index.js 主入口文件
-- header.js 需要被index引入的文件


#  index.html
<!DOCTYPE html>
<html lang="cn">
<head>
    <meta charset="UTF-8">
    <title>第一个webpack页面</title>
</head>
<body>
 <script src="main.js"></script>   
</body>
</html>
<!--打包好的js名称默认是main.js-->


#  index.js
import {header} from './header.js'
document.body.append(header);


#  header.js
var header =document.createElement("div");
header.innerHTML="你好webpack from header";
export {header};

使用配置文件

在项目目录 新建一个webpack.config.js webpack默认配置文件

const path = require('path')
// 引入node的 path路径模块

module.exports={
    entry:'./index.js',
    // 指定文件的入口
    output:{
        filename:'main.js',
        // 定义文件名
        path:path.resolve(__dirname,'dist')
        // 定义文件夹 
        // __dirname获取当前目录
        // path.resolve 方法将路径或路径片段的序列解析为绝对路径
    }
    // 指定打包好的出口
}
// module.export node中导出模块的意思

# 以下为纯净版本
const path = require('path')
module.exports={
    entry:'./index.js',
    output:{
        filename:'main.js',
        path:__dirname+'/dist',
    }
}

核心概念:入口 entry、输出 output、mode 模式、loader 加载器、plugins 插件

输出output:

{
path:__dirname+"/dist",
filename:"main.js"
}

mode模式:

mode: "development", //开发模式
mode: "production", //产品模式

loader加载器:

定义:让webpack拥有处理非js的文件

style-loader:把css插入到style标签、css-loader:加载css

安装

npm i style-loader css-loader -D

配置文件

// 模块
	module:{
		// 规则
		rules:[
			{
			//测试.css文件结尾
			test:/\.css$/,
			// 使用两个loader加载器
			use:["style-loader","css-loader"],
			
			}
		]
	}

plugins插件:

定义:处理内容外在webpack处理过程中额外操作,加载模板,压缩,服务器。。。。

1、html-webpack-plugin: 

把html模板文件加载到dist目录,并插入打包好的js

安装

npm i html-webpack-plugin

配置:

const htmlWebpackPlugin = require("html-webpack-plugin")

plugins:[
    new htmlWebpackPlugin({
        template:"./public/index.html"
     })
]

2、  file-loader: 加载文件
        url-loader:基于file-loader  如果文件比较小 转成base64格式 减少http请求的次数

安装:

npm i file-loader url-loader -D

3、clean-webpack-plugin:清理 dist 目录

安装:

npm i clean-webpack-plugin -D

4、optimize-css-assets-webpack-plugin:优化css插件

安装 :

npm i optimize-css-assets-webpack-plug -D

导入:

const optimizeCss = require('optimize-css-assets-webpack-plugin')

使用:

// 优化选项
	optimization: {
		// 压缩
	    minimizer: [ new optimizeCss()],
	}, 

webpack 自用笔记

5、mini-css-extract-plugin: 把css文件抽出为一个单独.css文件

安装:

npm i mini-css-extract-plugin -D 

导入

const miniCssExtractPlugin=require('mini-css-extract-plugin')

使用loader:

use:[miniCssExtractPlugin.loader,"css-loader"],

使用插件:

new miniCssExtractPlugin({
			filename:"style-[hash:7].css"
		})

6、optimize-css-assets-webpack-plugin: css优化

      terser-webpack-plugin:js压缩优化

安装 :

npm i optimize-css-assets-webpack-plugin -D
npm i  terser-webpack-plugin -D

导入:

// 使用css优化插件
const optimizeCss = require('optimize-css-assets-webpack-plugin')
// 把css单独抽出为一个文件
const miniCssExtractPlugin=require('mini-css-extract-plugin')
// 导入js压缩插件
const TerserPlugin = require("terser-webpack-plugin");

使用:

// 优化选项
    optimization: {
        // 压缩
        minimize: true,
        // 指定压缩器
        minimizer: [ 
            new optimizeCss(),
            new TerserPlugin()
            ],
    }, 

本地服务器

作用:本地启动一个服务器

安装:

npm i webpack-dev-server

配置:

devServer:{
		open:true,//自动打开浏览器
		hot:true,//热更新
		host:"localhost",//本地域名
		port:8080,//端口号
		proxy:{}//同vue.config.js 里面的代理配置
	}

package.json

script
"serve":"webpack server",

启动命令:

npm run serve

webpack优化

1、hash哈希:

内容相同,文件名称也就相同,如果浏览器已经请求过同样的名称,浏览器二次请求会从缓存里面取

hash    打包的变化算出一段字符
contentHash    内容内容变化算出一段字符
chunkHash    根据入口文件算出一段字符串

2、压缩:

压缩css:    optimize-css-assets-webpack-plug
压缩js:    terser-webpack-plugin

3、分割:

大文件拆分:

optimization: {
		// 代码分割
		splitChunks: {
		    chunks: "all", 
		},
}
filename:'[name]-[hash:7].js'

4、soureMap:

源代码对应关系(出错)

devtool:'eval-cheap-source-map',

5、treeShake功能,摇树功能

作用:没有用的模块不导入

optimization: {
		usedExports: true,
}

//package.json 配置哪些文件不被摇掉
"sideEffects":["@babel/polly-fill","*.css"],

6、异步加载

pic.onclick = function(){
	import(/* webpackChunkName:"jquery", webpackPrefetch: true*/"jquery")
	.then(({default:$})=>{
		// jq加载完毕,单击红色,显示其文本
		$(".red").click(function(){
			alert($(this).text())
		})
	})
}

7、预加载 prefetch

import(/* webpackChunkName:"jquery", webpackPrefetch: true*/"jquery")

webpack魔法注释:
    /* webpackChunkName:"jquery"*/ 导入的文件打包后的名称
    /*webpackPrefetch: true*/ 当网络有空闲的时候提前下载该文件

8、按需导入

@babel/plugin-syntax-dynamic-importvue,element-ui 按需下载都需要

配置 babelrc plugins:

{
  "presets": ["@babel/preset-env","@babel/preset-react"],
  "plugins":["@babel/plugin-syntax-dynamic-import"]
 }

 多入口打包

1. 配置入口 
 

entry:{
        "vue":"./src/main.js",
        "base":"./src/index.js"
    },

2. 配置 html-webpack-plugin

new htmlWebpackPlugin({
            // 指定模板地址
            template:"./public/index.html",
            // 哪些入口文件生成js插入到当前模板
            chunks:["vue"],
            // 传入模板的标题参数
            title: 'vue-webpack',
            // 打包生成文件名称
            filename: 'index.html'
        }),
        new htmlWebpackPlugin({
            // 指定模板地址
            template:"./public/base.html",
             chunks:["base"],
             title: '基础webpack',
              filename: 'base.html'
        }),


 

上一篇:第五十篇:webpack中的loader


下一篇:Vue动态组件的实践与原理探究