Webpack详解与配置环境

news2024/9/25 23:25:46

webpack:webpack网址

1、工作原理:

Webpack是一个非常强大的静态模块的打包工具。从文件入口开始,递归解析以来关系,然后将所有模块打包成一个或多个budle文件。

2、webpack核心概念:


Entry:入口起点(entry point)指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始。

进入入口起点后,webpack 会找出有哪些模块和库是入口起点(直接和间接)依赖的。每个依赖项随即被处理,最后输出到称之为 bundles 的文件中。

Output:output 属性告诉 webpack 在哪里输出它所创建的 bundles,以及如何命名这些文件,默认值为 ./dist。基本上,整个应用程序结构,都会被编译到你指定的输出路径的文件夹中。

Module:模块,在 Webpack 里一切皆模块,一个模块对应着一个文件。Webpack 会从配置的 Entry 开始递归找出所有依赖的模块。

Chunk:代码块,一个 Chunk 由多个模块组合而成,用于代码合并与分割。

Loader:loader 可以将所有类型的文件转换为 webpack 能够处理的有效模块,然后你就可以利用 webpack 的打包能力,对它们进行处理。 本质上,webpack loader 将所有类型的文件,转换为应用程序的依赖图(和最终的 bundle)可以直接引用的模块。

Plugins: loader 被用于转换某些类型的模块,而plugins(插件)则可以用于执行范围更广的任务。 插件的范围包括,从打包优化和压缩,一直到重新定义环境中的变量。插件接口功能极其强大,可以用来处理各种各样的任务(包括:打包优化,资源管理,注入环境变量)

1.入口( entry ):

entry 对象是用于 webpack 查找启动并构建 bundle 。entry 是应用程序的起点入口,从这个起点开始,应用程序启动执行。如果传递一个数组,那么数组的每一项都会执行。入口起点(entry point) 指示 webpack 应该使用哪个模块,来作为构建其内部依赖图(dependency graph ) 的开始。进入入口起点后,webpack 会找出有哪些模块和库是入口起点(直接和间接)依赖的

简单规则:每个 HTML 页面都有一个入口起点。单页应用(SPA):一个入口起点,多页应用(MPA):多个入口起点。

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

//单入口--字符串
module.exports = {
  entry: './path/to/my/entry/file.js',
};
//多入口--数组
module.exports = {
  entry: ['./src/index.js', './src/add.js']
};
//多入口--对象
module.exports = {
  entry: {
    home: './home.js',
    about: './about.js',
    contact: './contact.js'
  }
};

entry 的值类型:

字符串:单入口,打包形成一个chunk,最终只会输出一个 bundle 文件,chunk 的名称默认是 main

数组:多入口,所有的入口文件最终也只会形成一个chunk,最终输出一个 bundle 文件,chunk 的名称默认为 main 。一般只用在 HMR 功能中让html热更新生效

对象:多入口,有多少个 key 就会形成多少个chunk,也就输出多少个 bundle 文件,每个键(key)会是 chunk 的名称。在对象类型中,每个key的值还可以是一个数组,不仅仅是一个字符串

2.输出( output ):

//webpack.config.js
const path = require('path');
module.exports = {
  entry: './path/to/my/entry/file.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'my-first-webpack.bundle.js', 
  },
};

2.1:output .filename(文件名和目录)

此选项决定了每个输出 bundle 的目录和名称。这些 bundle 将写入到 output.path 选项指定的目录下。

对于单个入口起点,filename 会是一个静态名称。然而,当通过多个入口起点( entry point)、代码拆分( code splitting )或各种插件(plugin)创建多个 bundle ,应该使用其他方法来让每个 bundle 都有一个唯一的名称。

module.exports = {
  //...
  output: {
    filename: 'js/bundle.js'
  }
};
//多入口--使用入口名称:
module.exports = {
  //...
  output: {
    filename: '[name].bundle.js'
  }
};
//多入口--使用每次构建过程中,唯一的 hash 生成
module.exports = {
  //...
  output: {
    filename: '[name].[hash].bundle.js'
  }
};
...

2.2、 output .path(文件目录)

output .path 指定所有输出文件的目录,即将来所有资源输出的公共目录。path 必须是绝对路径。

module.exports = {
  //...
  output: {
    path: path.resolve(__dirname, 'dist')
  }
};

2.3、 output .publicPath(引用资源的路径前缀)

publicPath 指定的是 html 文件中的所有资源引入的公共路径前缀。它并不会对生成文件的路径造成影响,而是在 html 文件引入各种资源时,将 publicPath 作为前缀加到引入资源的路径前面。

实例:

在 vue-cli 生成的 webpack 配置中,生产环境下 publicPath 的值默认是 '/',即当前目录的根目录。

打包过后,我们打开 html 文件,可以看到 html 文件中引入的资源路径为:

可以看到,都在路径前面加了 / 符号。当我们打开浏览器访问生成的 html 文件时,会发现报错,资源访问不到,报404,此时资源的访问类似如下:

在服务器上可能会是如下,但访问一样可能会有问题。

我们可以将 publicPath 修改为相对路径,或者直接把它注释掉也行。

3.Loader:

在 webpack 的配置中,loader 有两个属性:

test 属性,识别出哪些文件会被转换。

use 属性,定义出在进行转换时,应该使用哪个 loader。

include/exclude(可选):手动添加必须处理的文件(文件夹)或屏蔽不需要处理的文件(文件夹)

query(可选):为loaders提供额外的设置选项

//示例:webpack.config.js
const path = require('path');
module.exports = {
  output: {
    filename: 'my-first-webpack.bundle.js',
  },
  module: {
    rules: [
        { test: /\.txt$/, loader: 'raw-loader' },
        { test: /\.css$/, use: ['style-loader', 'css-loader'] }   //使用多个loader的话应该用 use
    ], 
  },
};

以上配置中,对一个单独的 module 对象定义了 rules 属性,里面包含两个必须属性:test 和 use。这相当于告诉 webpack 编译器在碰到 require()/import 语句中被解析为 '.txt' 的路径时,在对它打包之前,先使用raw-loader 转换一下。

使用多个loader的话应该用 use ,use 数组中的 loader 执行顺序:从右到左,依次执行。比如上面的 css 文件,首先 css-loader 会将 css 文件编译成 JS 加载到 JS文件中,然后再由 style-loader 创建 style 标签,将 JS 中的样式资源插入到 head 标签中。

1.1、CSS-loader

webpack提供两个工具处理样式表,css-loader 和 style-loader,二者处理的任务不同。css-loader使你能够使用类似import的方法来引入 css 文件,style-loader将所有的计算后的样式加入页面中,二者组合在一起使你能够把样式表嵌入webpack打包后的JS文件中,由此就可以在JS文件中引入css文件了
 

//安装
npm install --save-dev style-loader css-loader  //css-loader版本太高编译可能会出错,建议降低版本比如 css-loader@1.0.1 可用
//使用
module.exports = {
   ...
    module: {
        rules: [
            {
                test: /(\.jsx|\.js)$/,
                use: {
                    loader: "babel-loader"
                },
                exclude: /node_modules/
            },
            {
                test: /\.css$/,  //对同一个文件引入多个loader的方法。loader的作用顺序是后面的loader先开始作用
                use: [
                    {
                        loader: "style-loader"
                    }, {
                        loader: "css-loader"
                    }
                ]
            }
        ]
    }
};

4.插件(plugin)

Loader 用于转换某些类型的模块,而插件则可以用于执行范围更广的任务,包括:打包优化、压缩、资源管理、注入环境变量等。插件目的在于解决 loader 无法实现的其他事。

要使用某个插件,我们需要通过npm安装它,然后在 plugins 属性下添加该插件的一个实例。由于插件可以携带参数/选项,你必须在 webpack 配置中,向 plugins 属性传入 new 实例。多数插件可以通过选项自定义,你也可以在一个配置文件中因为不同目的而多次使用同一个插件。

//webpack.config.js
const HtmlWebpackPlugin = require('html-webpack-plugin'); // 通过 npm 安装
const webpack = require('webpack'); // 用于访问内置插件
module.exports = {
  module: {
    rules: [{ test: /\.txt$/, use: 'raw-loader' }],
  },
  plugins: [new HtmlWebpackPlugin({ template: './src/index.html' })],
};

4.1、案例 BannerPlugin插件(添加版权说明)

下面我们添加了一个给打包后代码添加版权声明的插件。该插件是webpack中的内置插件不用安装。

const webpack = require('webpack');
module.exports = {
...
    module: {
        rules: [
            {
                test: /(\.jsx|\.js)$/,
                use: {
                    loader: "babel-loader"
                },
                exclude: /node_modules/
            },
            {
                test: /\.css$/,
                use: [
                    {
                        loader: "style-loader"
                    }, {
                        loader: "css-loader",
                        options: {
                            modules: true
                        }
                    }, {
                        loader: "postcss-loader"
                    }
                ]
            }
        ]
    },
    plugins: [
        new webpack.BannerPlugin('wenxuehai版权所有,翻版必究')
    ],
};

3、Webpack打包过程

读取配置文件:Webpack会首先读取项目中的配置文件,例如webpack.config.js或者webpackfile.js等。

解析入口文件:Webpack会从配置文件中获取入口文件路径,根据入口文件路径解析出入口文件及其依赖的模块。

解析依赖模块:Webpack会逐个解析入口文件依赖的模块,以此类推,逐步构建出完整依赖树。

加载模块:Webpack会根据解析出的模块路径逐个加载模块,支持多种文件格式的加载。

分析模块依赖关系及模块交互:Webpack会分析每个模块之间的依赖关系,例如调用其它模块的函数或变量引用等,以此建立模块之间的交互关系图。

打包模块:Webpack会将所有模块根据依赖树的关系,逐步打包成一个或多个JavaScript文件,支持多种打包方式。

生成输出文件:Webpack会根据配置文件中指定的输出路径和文件名,生成最终的输出文件。

优化打包结果:Webpack还提供了一些优化功能,例如压缩代码、合并模块等,可以进一步提升打包结果的性能和效率。

构建完成:Webpack打包过程完成后,会输出一些统计信息以及警告或错误信息,方便开发者定位和解决问题。

4、Webpack生命周期:

Webpack 在构建过程中会触发一系列的生命周期事件,开发者可以针对这些事件进行相应的处理或插件化。下面是Webpack的主要生命周期事件:

beforeRun:在 Webpack 开始执行构建任务前触发的事件。
run:Webpack 开始进行编译打包时触发的事件。
beforeCompile:在 Webpack 开始编译之前触发的事件。
compile:Webpack 开始编译时触发的事件。
compilation:在 Webpack 的每次编译构建过程中触发的事件。
emit:在 Webpack 输出资源到output目录之前触发的事件。
afterEmit:在 Webpack 输出资源到output目录之后触发的事件。
done:Webpack 构建完成所有的编译、和输出等任务之后触发的事件。
failed:Webpack 构建过程中出现错误时触发的事件。

webpack配置vue3开发环境

1.npm i -D webpack webpack-cli webpack-dev-server

webpack是基本的包
webpack-cli是执行脚本的包
webpack-dev-server是启动一个开发服务器的包

2.配置html-webpack-plugin插件

       2.1 npm i -D html-webpack-plugin

       2.2 在项目根目录下创建index.html模板和下载html-webpack-plugin插件,然后修改index.html文件,添加一个id为root的div标签,再在webpack.config.js中配置html插件.

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div id="app"></div>
    <h1>123</h1>
  </body>
</html>

3.下载vue和vue-loader(webpack默认不识别.vue结尾的文件,需要下载loader解析)vue-loader文档地址,安装成功之后配置webpack.config.js,然后编写入口文件index.js导入vue。

        3.1 

                npm i vue
                npm i -D vue-loader

4.手动添加css-loader

         npm i -D vue-style-loader css-loader


5.手动添加sass和sass-loader

        npm i sass
        npm i -D sass-loader

 

6.package.json脚本 添加webpack打包指令

  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint",
    "webpackbuild": "webpack"
  }

7.添加typescript支持和ts-loader。vue-loader支持ts

因为要支持typescript,首先使用tsc --init在项目根目录下生成一个tsconfig.json文件,然后修改index.js为index.ts,当然webpack.config.js中的入口文件的index.js也需要修改为index.ts,然后添加参考vue-loader的文档添加ts-loader配置。因为要使ts识别vue,要在根目录添加一个env.d.ts的声明文件

        7.1

                 npm install -D typescript ts-loader

// webpack.config.js
module.exports = {
  resolve: {
    // 将 `.ts` 添加为一个可解析的扩展名。
    extensions: ['.ts', '.js']
  },
  module: {
    rules: [
      // ... 忽略其它规则
      {
        test: /\.ts$/,
        loader: 'ts-loader',
        options: { appendTsSuffixTo: [/\.vue$/] }
      }
    ]
  },
  // ...plugin omitted
}
// env.d.ts
declare module "*.vue" {
    import { DefineComponent } from "vue"
    const component: DefineComponent<{}, {}, any>
    export default component
}
<template>
    <div class="container">
        <h1>hello</h1>
    </div>
</template>

<script setup lang="ts">
import { ref, Ref } from "vue";
const count: Ref<number> = ref(123);
</script>

<style scoped lang="scss">
.one {
    color: yellowgreen;
}
</style>

需要修改tsconfig.json中的strict为false,这样可以避免一些小问题。

或 

添加:

  "javascript.validate.enable": false

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2104687.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端使用xlsx模板导出表格

前言 前端导出表格有很多种方案&#xff0c;但是表格样式一旦复杂了&#xff0c;那么就得用代码写excel的样式&#xff0c;还是比较麻烦的。每次样式不一样&#xff0c;就得重新写&#xff0c;这时使用表格模板的优势就体现出来了&#xff0c;想导出不同样式的表格直接修改表格…

UMI复现代码解读全流程 视觉部分(六)——06_generate_dataset_plan.py(尚在更新)

视觉主要采用orb-slam3,分为主文件run_slam_pipeline和7个副文件在文件夹scripts_slam_pipeline中 06生成了pkl文件,是run_slam_pipeline的最终一步 06注释版已发到群里 06是一个比较重要的文件,定义了训练时的运动末端参数,作为训练输入 @click.option(-to, --tcp_offset…

uniapp 懒加载、预加载、缓存机制深度解析

uniapp 懒加载、预加载、缓存机制深度解析 文章目录 uniapp 懒加载、预加载、缓存机制深度解析一、为什么要使用uniapp的懒加载、预加载和缓存机制二、如何使用uniapp的懒加载、预加载和缓存机制1. 懒加载2. 预加载3. 缓存机制 四、扩展与高级技巧1. 结合懒加载和预加载优化页面…

2024数博会技术成果回顾 | KPaaS助力企业数智化转型

2024年8月28日至30日&#xff0c;中国国际大数据产业博览会&#xff08;简称“数博会”&#xff09;在贵州省贵阳市隆重举行。本届数博会以“数智共生&#xff1a;开创数字经济高质量发展新未来”为主题&#xff0c;吸引了来自全球各地的400多家企业和2.1万余名嘉宾参与&#x…

UART串口通信——FPGA学习笔记9

一、数据通信基本概念 按数据通信方式分类&#xff1a; 串行通信、并行通信 按数据传输方向分类&#xff1a; 单工通信、半双工通信、全双工通信 按数据同步方式分类&#xff1a; 同步通信、异步通信 常见的串行通信接口&#xff1a; 二、串口通信&#xff1a; UART 是一种…

Cobalt Strike 4.8 用户指南-第六节-Payload Artifacts和反病毒规避

Fortra 经常回答有关规避的问题。Cobalt Strike 会绕过反病毒产品吗&#xff1f;它绕过了哪些反病毒产品&#xff1f;多久检查一次&#xff1f; Cobalt Strike 默认Artifact可能会被大多数端点安全解决方案拦截。尽管规避不是Cobalt Strike产品默认的目标&#xff0c;但Cobalt…

记一次cms的web渗透测试练习

点击文章发现 尝试进行sql注入 得到漏洞为数字型 通过order by语句得到字段总数为15 通过union联合查询得到显示的字段编号 将database()带入得到数据库名为cms 接下来就是查表名、字段名、具体数据 发现密码经过加密&#xff0c;尝试解密 通过解密得知admin账户的密码为12…

潮玩宇宙斗兽场游戏源码多个猿猴boss模式玩法开发成品案例代码示例

潮玩宇宙中的斗猿场是很多潮玩人都喜欢玩的一种大逃杀类游戏&#xff0c;玩法大概是这样的&#xff0c;玩家选择一个格子躲避恶猿&#xff0c;满足人数后恶猿会按随机数顺时针前行&#xff0c;在某个格子停留后杀死里面所有猴子&#xff0c;被踩中的格子内的玩家则会被恶猿杀掉…

glsl着色器学习(十)缩放

对二维图形进行缩放&#xff0c;需要用到顶点着色器&#xff0c;顶点着色器经过矩阵变换&#xff0c;会将模型空间最终转换成裁剪空间。下面就来操作矩阵 这里需要用到一个库glMatrix。 首先修改顶点着色器 <script id"vertex-shader-2d" type"x-shader/x-…

【AI大模型】2024 大模型爆发年,这些教程足够你入局AI大模型,搭上行业风口!

如果说 2023 年被称为 AI 元年&#xff0c;那么 2024 年就正式步入了爆发年&#xff01;几乎身边的每个程序员/每个产品经理都在思考&#xff1a;如何入局AI大模型&#xff1f;怎样才能成为这只风口上的猪&#xff1f; 作为一个普通人&#xff0c;应该如何入局&#xff1f;怎样…

多面体随旋转发出不同色彩效果

多面体随旋转发出不同色彩效果 下载地址&#xff1a;https://download.csdn.net/download/Allen7474/89713552 效果图&#xff1a; 实现细节&#xff1a; >>阶段1&#xff1a; >>阶段2&#xff1a; >>阶段3&#xff1a;

微软Azure OpenAI 集成矢量化

Azure AI Search中已全面支持集成矢量化与 Azure OpenAI 嵌入。 这标志着我们持续致力于简化和加快检索增强生成 (RAG)和传统应用程序的数据准备和索引创建的重要里程碑。 集成矢量化简化了 RAG 流程 参考链接&#xff1a;微软Azure OpenAI 免费试用申请 为什么矢量化很重要…

VBA中类的解读及应用第十五讲:让文本框在激活时改变颜色(上)

《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。 类&#xff0c;是非常抽象的&#xff0c;更具研究的价值。随着我们学习、应用VBA的深入&#xff0…

css设置让整个盒子的内容渐变透明(非颜色渐变透明)

css设置让整个盒子的内容渐变透明&#xff08;非颜色渐变透明&#xff09; 效果核心css代码 效果 核心css代码 /* 设置蒙版上下左右渐变显示 */ mask-image: linear-gradient(to right, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 10%, rgba(0, 0, 0, 1) 90%, rgba(0, 0, 0, 0) 1…

使用命令行窗口新建一个Java文件,输出HelloWorld

进入桌面 cd desktop在桌面新建文件夹 mkdir zwt进入文件夹&#xff0c;新建.Java文件 cd zwt echo. > helloWorld.java使用记事本打开文件编写代码 notepad HelloWorld.java此时电脑就会自动打开文件&#xff0c;直接编写代码 public class HelloWorld(){public stati…

北京君正低功耗MCU芯片应用在柯氏音法电子血压计

汉王科技&#xff0c;作为一家在中关村有着30年品牌历史的人工智能企业&#xff0c;始终致力于利用先进技术提升人们的生活品质。近日&#xff0c;继血压计KSY-FF660上市掀起血压测量新标准后&#xff0c;汉王科技再次突破行业创新&#xff0c;推出一体式柯氏音法电子血压计FY7…

高速信号真的可以参考电源层吗?

信号电流必须具有完整的环路&#xff0c;才可传递信息。完整的环路即信号由驱动器发出&#xff0c;经导线传输至接收器&#xff0c;然后再通过某种途径由接收器返回驱动器&#xff0c;形成闭环回路。   高速信号的参考平面一般为信号GND平面&#xff0c;是否可以参考电源平面…

使用iframe在Vue中实现ChatGPT嵌入及微前端解决方案

更多内容个人网站&#xff1a;孔乙己大叔 在现代Web开发中&#xff0c;iframe&#xff08;Inline Frame&#xff09;是一个强大的工具&#xff0c;它允许开发者在一个HTML文档中嵌入另一个HTML文档。这种技术不仅可用于简单的网页内容嵌入&#xff0c;还广泛应用于复杂的应用集…

C++基础之杂项

目录 思维导图&#xff1a; 学习内容&#xff1a; 1. Lambda表达式 1.1 基本概念 1.2 定义格式 1.3 常用情况 二、异常处理 2.1 什么是异常处理 2.2 何时使用异常处理 2.3 异常处理的格式 2.4 异常实例 2.5 构造和析构中的异常 2.6 系统提供异常类 三、C中文件…

Arduino基础入门学习——使用BH1750(GY-302)光照强度传感器获取光照强度

使用BH1750&#xff08;GY-302&#xff09;光照强度传感器获取光照强度 一、前言二、BH1750&#xff08;GY-302&#xff09;介绍三、准备工作四、程序代码五、运行结果六、结束语 一、前言 话不多说&#xff0c;先给大家来一句鸡汤&#xff08;鸡汤来咯&#xff01;&#xff09…