webpack总结

webpack的网址:概念 | webpack 中文文档 | webpack 中文文档 | webpack 中文网

1:webpack是什么?

概念

本质上,webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具。当 webpack 处理应用程序时,它会在内部从一个或多个入口点构建一个 依赖图(dependency graph),然后将你项目中所需的每一个模块组合成一个或多个 bundles,它们均为静态资源,用于展示你的内容。

2:webpack的核心概念:

从 v4.0.0 开始,webpack 可以不用再引入一个配置文件来打包项目,然而,它仍然有着 高度可配置性,可以很好满足你的需求。

在开始前你需要先理解一些核心概念

本文档旨在给出这些概念的高度概述,同时提供具体概念的详尽相关用例的链接。

为了更好地理解模块打包工具背后的理念,以及在底层它们是如何运作的,请参考以下资源:

入口(entry)

入口起点(entry point) 指示 webpack 应该使用哪个模块,来作为构建其内部 依赖图(dependency graph) 的开始。进入入口起点后,webpack 会找出有哪些模块和库是入口起点(直接和间接)依赖的。

默认值是 ./src/index.js,但你可以通过在 webpack configuration 中配置 entry 属性,来指定一个(或多个)不同的入口起点。例如:

webpack.config.js

module.exports={
	entry:"./src/index.js",//入口
	},

输出(output)

output 属性告诉 webpack 在哪里输出它所创建的 bundle,以及如何命名这些文件。主要输出文件的默认值是 ./dist/main.js,其他生成文件默认放置在 ./dist 文件夹中。

你可以通过在配置中指定一个 output 字段,来配置这些处理过程:

webpack.config.js

module.exports={
	entry:"./src/index.js",//入口
	output:{//出口
		filename:"main-[hash].js",//文件名
		path:__dirname +"/dist"//文件夹 __dirname 当前目录
	},

在上面的示例中,我们通过 output.filename 和 output.path 属性,来告诉 webpack bundle 的名称,以及我们想要 bundle 生成(emit)到哪里。可能你想要了解在代码最上面导入的 path 模块是什么,它是一个 Node.js 核心模块,用于操作文件路径。

loader:加载器

css处理:

安装:npm i class-loader style-loader -D

作用:class-loader处理.css文件 style-loader把css加载到style标签

module:{
		rules:[
			//当文件名test通过,使用如下插件
			{test:/\.css$/,use:["style-loader","css-loader"]}
		]
	},

webpack 只能理解 JavaScript 和 JSON 文件,这是 webpack 开箱可用的自带能力。loader 让 webpack 能够去处理其他类型的文件,并将它们转换为有效 模块,以供应用程序使用,以及被添加到依赖图中。

Warning

webpack 的其中一个强大的特性就是能通过 import 导入任何类型的模块(例如 .css 文件),其他打包程序或任务执行器的可能并不支持。我们认为这种语言扩展是很有必要的,因为这可以使开发人员创建出更准确的依赖关系图。

在更高层面,在 webpack 的配置中,loader 有两个属性:

  1. test 属性,识别出哪些文件会被转换。
  2. use 属性,定义出在进行转换时,应该使用哪个 loader。

webpack.config.js

const path = require('path');

module.exports = {
  output: {
    filename: 'my-first-webpack.bundle.js',
  },
  module: {
    rules: [{ test: /\.txt$/, use: 'raw-loader' }],
  },
};

以上配置中,对一个单独的 module 对象定义了 rules 属性,里面包含两个必须属性:test 和 use

处理文件(图片 文件)

1.安装:npm i file-loader url-loader -D

2.作用: 加载图片和文件

3.

{test:/\.(png|jpg|jpeg|webp|ico|gif|bmp)$/,
			use:[{
				loader:"url-loader",//使用url加载器
				options:{limit:5000,name:"images/[hash].[ext]"},
				//选项,当图片小于5000文节时候,转换base64 (小图片减少一次http请求)
				//文件命名 images文件夹 hash值 (计算出图片的名称) ext后缀名
			}]
			}

插件(plugin)

1.html模板插件:

2.安装:npm i html-webpack-plugin -D

3.作用:生成html模板文件,自动把打包好的js插件插入到模板文件

在webpack.config .js 导入     const HtmlWebpackPlugin = require('html-webpack-plugin')
plugins:[
		//实例化插件,指定template模板的位置
		new HtmlWebpackPlugin({
			template:"./public/index.html"
		})
	],

loader 用于转换某些类型的模块,而插件则可以用于执行范围更广的任务。包括:打包优化,资源

管理,注入环境变量。

Tip

查看 插件接口(plugin interface),学习如何使用它来扩展 webpack 能力。

想要使用一个插件,你只需要 require() 它,然后把它添加到 plugins 数组中。多数插件可以通过选项(option)自定义。你也可以在一个配置文件中因为不同目的而多次使用同一个插件,这时需要通过使用 new 操作符来创建一个插件实例。

webpack.config.js

const HtmlWebpackPlugin = require('html-webpack-plugin');
const webpack = require('webpack'); // 用于访问内置插件

module.exports = {
  module: {
    rules: [{ test: /\.txt$/, use: 'raw-loader' }],
  },
  plugins: [new HtmlWebpackPlugin({ template: './src/index.html' })],
};

在上面的示例中,html-webpack-plugin 为应用程序生成一个 HTML 文件,并自动将生成的所有 bundle 注入到此文件中。

清理dist目录:

1.安装:npm i clean-webpack-plugin -D

2.作用:打包前删除dist目录

3.

 4.

抽出插件:

1.安装:npm i mini-css-extract-plugin -D

2.作用:把css抽出一个单独的文件

3.导入:

// 导入css 抽出插件
const MiniCssExtractPlugin = require("mini-css-extract-plugin");

4.配置loader:{
                test: /\.css$/,
                use: [  MiniCssExtractPlugin.loader, "css-loader"]
            },

5.实例化插件:     new MiniCssExtractPlugin()

优化:

1.css压缩

安装:npm i css-minimizer-webpack-plugin -D

2.导入:

 

3.js压缩:

安装:npm i terser-webpack-plugin -D

导入:

 4.实现压缩与优化:

optimization: {
    minimize: true, //默认是压缩
    minimizer: [new CssMinimizerPlugin(),new TerserPlugin()],//压缩器
	},

5.代码分割:

optimization: {
    splitChunks: {
        chunks: "all", 
       // 所有的 chunks 代码公共的部分分离出来成为一个单独的文件},
}

devServer

1.安装:npm i webpack-dev-serve -D

2.作用:开启一个本地服务器。

3.open:true是否自动打开浏览器

4.host:“localhost”;域名

4.port:8080//端口号

5.hot:true  更新(文件保存,网页自动更新)

 6.package.json:

 7.运行项目:

npm run serve

打包指令:npm run build

特殊标识:

1.[hash] 把内容通过hash算法算出来的一串字符.

2.[hash:7] 取hash字符串前7个.

3.[name] 源文件名称.

4.[ext] 文件的后缀名

目录别名:

resolve: {
		// 别名:@代表是 src目录
		alias: {
			'@': path.resolve(__dirname, './src'), //设置@为src目录的别名
		}
	},

开发工具:

1.

 2.作用:错误与源代码有一个一一对应关系。

link与script:

<script defer src=""></script>
等待页面内容加载好再去加载js
<link href= “” rel=prefetch>
提前预加载css

webpack中的魔法注释:

2.给当前的js文件命名:

 webpackChunkName:"jquery"

 

3.网络有空闲预加载js:

  webpackPrefetch: true

 哈希命名的作用:

1. 可以控制浏览器的缓存
当文件发生变化时候,hash就变化,文件名也就变化,浏览器就不缓存
当文件名保持不变,浏览器二次请求会从缓存里面去请求内容。

2.可以提供二次加载的速度(有效的控制缓存)

3.contenthash:内容发生变化 contenthash值才发送变化

4.chunkhash:入口发生变化,当前的文件chunkhashhash会变化

5.hash:只要项目内容发送变化,hash就会变化

 

配置(Configuration)

你可能已经注意到,很少有 webpack 配置看起来完全相同。这是因为 webpack 的配置文件是 JavaScript 文件,文件内导出了一个 webpack 配置的对象 webpack 会根据该配置定义的属性进行处理。

由于 webpack 遵循 CommonJS 模块规范,因此,你可以在配置中使用

  • 通过 require(...) 引入其他文件
  • 通过 require(...) 使用 npm 下载的工具函数
  • 使用 JavaScript 控制流表达式,例如 ?: 操作符
  • 对 value 使用常量或变量赋值
  • 编写并执行函数,生成部分配置

请在合适的场景,使用这些功能。

虽然技术上可行,但还是应避免如下操作

  • 当使用 webpack CLI 工具时,访问 CLI 参数(应编写自己的 CLI 工具替代,或者使用 --env
  • 导出不确定的结果(两次调用 webpack 应产生相同的输出文件)
  • 编写超长的配置(应将配置文件拆分成多个

基本配置:

const path = require('path');

module.exports = {
  mode: 'development',
  entry: './foo.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'foo.bundle.js',
  },
};

环境变量

配置:通过环境命令  产品环境 压缩代码,是生产环境不压缩代码,打开devtool

1.项目开发中,产品环境:

 

2.安装:npm i cross-env -D

3.package.json传参:

"build": "cross-env NODE_ENV=production webpack",
    "serve": "cross-env NODE_ENV=development webpack serve",

4.js文件中使用:

var baseURL = "";
if(process.env.NODE_ENV=="production"){
	baseURL = "http://dida100.com";
}else{
	baseURL = "http://localhost"
}
console.log("当前环境:",process.env.NODE_ENV,baseURL);

想要消除 webpack.config.js 在 开发环境 和 生产环境 之间的差异,你可能需要环境变量(environment variable)。

Tip

webpack 环境变量,与操作系统中的 bash 和 CMD.exe 这些 shell 环境变量 不同。

webpack 命令行 环境配置 的 --env 参数,可以允许你传入任意数量的环境变量。而在 webpack.config.js 中可以访问到这些环境变量。例如,--env production 或 --env goal=local

npx webpack --env goal=local --env production --progress

Tip

如果设置 env 变量,却没有赋值,--env production 默认表示将 env.production 设置为 true。还有许多其他可以使用的语法。更多详细信息,请查看 webpack CLI 文档。

对于我们的 webpack 配置,有一个必须要修改之处。通常,module.exports 指向配置对象。要使用 env 变量,你必须将 module.exports 转换成一个函数:

webpack.config.js:

const path = require('path');

module.exports = (env) => {
  // Use env.<YOUR VARIABLE> here:
  console.log('Goal: ', env.goal); // 'local'
  console.log('Production: ', env.production); // true

  return {
    entry: './src/index.js',
    output: {
      filename: 'bundle.js',
      path: path.resolve(__dirname, 'dist'),
    },
  };
};

vue脚手架:

1.不用vue脚手架如何搭建项目?

2.安装:npm i vue -S

处理.vue:  nmp i  vue-loader -D

变异vue目录:npm i vue-template-commpliter -D

热更新:npm  i vue-hot-reload-api -D

处理vue样式: npm i vue-style-loader -D

配置:

01 导入
const {VueLoaderPlugin}  =  require("vue-loader")

02 配置
{test:/\.vue$/,use:["vue-loader"]}

03 插件
plugins:[new VueLoaderPlugin()]

模板文件:
plugins:[new VueLoaderPlugin()]

js文件:

main.js
import { createApp } from 'vue';
// 导入App.vue
import App from './App.vue';
console.log(App);

// 创建App并挂载
createApp(App).mount("#app")

创建App.vue :

实例:

总结结束!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值