webpack详细教程

1,什么是webpackwebpack | webpack中文文档 | webpack中文网

  • Webpack 不仅是一个模块打包器(bundler),更完整的讲是一个前端自动化构建工具。
  • 在 Webpack 看来前端的所有资源文件(s/json/css/img/less/...)都会作为横块处理
  • 它将根据模块的依赖关系进行静态分析,生成对应的静态资源.

五个核心概念 

  • Entry:入起点(entry point)指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始。
  • Output:output 属性告诉 webpack 在哪里输出它所创建的 bundles,以及如何命名这些文件
  • Loader: loader让webpack 能够去处理那些非JavaScript 文件
  • Plugins: 插件则可以用于执行范围更广的任务。例:打包优化、压缩
  • Mode:横式,有生产模式 production 和开发模式development

理解Loader

  • Webpack 本身只能加载JS/JSON 块,如果要加载其他类型的文件(模块),就需要使用对应的loader进行转换/加载。
  • Loader 本身也是运行在 node.js 环境中的JavaScript 横块。
  • 本身是一个函数,接受源文件作为参数,返回转换的结果。
  •  loader 一般以xxx-loader 的方式命名,xxx代表了这个 loader 要做的转换功能,比如 less-loader。

理解Pligins

  • 插件可以完成一些loader 不能完成的功能。
  • 插件的使用一般是在 webpack 的配置信息 plugins 选项中指定。

Mode

  • 模式(Mode)指示 webpack 使用相应模式的配置

配置文件(默认)

  •  webpack.configjs:是一个 node 模块,返回一个json 格式的配置信息对象

 2,安装webpack

  • 全局安装(这一步暂时不需要做)
npm install webpack webpack-cli -g
  • 局部安装
npm init
npm install webpack webpack-cli -D   # cli  Command Line Interface 命令行接口

官方推荐使用『局部安装』,这样可以避免因为版本不同而产生的 BUG

3,webpack初体验 

 1.创建JS模块: src/index.js

import data from './data.json'

console.log(data)

function add(x,y){
    return x + y;
}

console.log(add(1,2))

2,创建JSON模块: src/data.json

{
    "name":"jack",
    "age":18
}

3,创建css文件: src/index.css

html,body{
    height: 100%;
    background-color: pink;
}

4,安装

npm init -y
npm i webpack webpack-cli -D

5,执行打包命令 『项目根目录下运行』

# 开发模式打包
npx webpack --entry ./src/index.js  --output-path ./build/js --output-filename bundle.js --mode development

webapck会以 ./src/index.js为入口文件开始打包,打包后输出到 ./build/bundle.js整体打包环境,是开发环境

# 生产模式打包
npx webpack --entry ./src/index.js  --output-path ./build/js --output-filename bundle2.js --mode production

webapck会以 ./src/index.js为入口文件开始打包,打包后输出到 ./build/bundle.js整体打包环境,是生产环境(对代码进行压缩到只剩下一行代码,在开发项目中对代码进行一个打包,解析速度等会变快)
  • –entry 设置入口
  • –output-path 设置输出目录
  • –output-filename 设置输出文件名
  • –mode 设置运行模式

区别 npmnpx ?

它们都是由Node提供的2个工具, 用来做工具包的相关处理
npm (Node Package Manager) : 包管理器, 用来下载工具包
npx (Node Package Excuted) : 包扩展工具, 用来运行工具包命令
npx 查找工具包的顺序: 局部查找 ==> 全局查找 ==> 运行

但是当在index.js中引入css样式,会进行一个报错

import "./index.css"

所以我们得到一个结论:

1.webpack能处理js/json资源,不能处理css/img等资源

2.生产环境和开发环境将ES6模块化编译成浏览器能识别的模块化~

3.生产环境比开发环境多一个压缩js代码

4,使用配置文件打包

问题:打包命令太复杂(需要指定打包的各种配置信息)

解决:通过JS类型的配置文件来指定打包的配置信息

项目根目录下创建文件 webpack.config.js,内容如下

const {resolve} = require('path'); // path模块是Node内置的
// __dirname:当前配置文件所在的目录绝对路径
// resolve: 用来拼接路径的函数

// 暴露配置对象
module.exports = {
    // 入口
    entry: './src/index.js',
  
    // 出口
    output: {
        path: resolve(__dirname, 'build'), // 打包文件所在的根目录
        filename: 'js/bundle.js', // 打包生成的js文件名(可以带目录)
        clean: true, // 打包时, 会先自动清空打包文件夹
    },
   
    // 模式
  	// mode: 'production',
    mode: 'development',
}

 创建完毕之后,在项目根目录执行如下命令:

npx webpack

5,打包样式

问题:webpack本身只能打包 JS 文件JSON 文件, 不能打包CSS文件

解决:利用css-loader & style-loader & less-loader 对CSS进行打包处理

首先是我们的准备工作

1,创建css文件:./src/index.css

html,body{
    margin: 0;
    padding: 0;
    height: 100%;
    background-color: pink;
}

2,创建less文件:./src/index.less

#title{
    color: #fff;
}

3.在入口JS文件中引入这些资源:./src/index.js

// 引入样式资源
import './index.css'  //只下载css-loader就只引入css文件 不然会报错
import './index.less' //只下载less-loader就只引入less文件 不然会报错

5-1:打包css文件

第一步:安装loader

npm i style-loader css-loader -D

第二步:修改webpack.config.js配置文件

module.exports = {
    mode: 'development',
    
    // 配置 loader
    module: {
        rules: [
          	// 配置 css 文件处理
            {
                test: /\.css$/, // 处理css文件
                use: [
                    "style-loader",		// 将 CSS 生成 style 标签插入 HTML 中
                    "css-loader"  		// 将 CSS 转为 CommonJS 的模块
                ]
            }   
        ]
    },
}

第三步:运行打包命令 『在项目的根目录下运行』

npx webpack

 5-2:打包less文件

第一步:安装loader

npm i less less-loader -D

第二步:配置loader

module.exports = {
    module: {
        rules: [
  		   // 配置 less 文件处理
            {
                test: /\.less$/, // 处理less文件
                use: [
                    'style-loader', // 将 CSS 生成 style 标签插入 HTML 中
                    'css-loader', // 将 CSS 转为 CommonJS 的模块
                    'less-loader' // 将Less编译为CSS
                ]
            },
        ]
    }
}	

第三步:运行打包命令 『在项目的根目录下运行』

npx webpack

6,打包HTML资源

问题: 在HTML中手动引入打包文件比较麻烦,且没有压缩处理

解决: 使用html-webpack-plugin打包HTML => 自动引入打包文件,压缩HTML

  1. 删除HTML中引入的JS打包文件

  2. 安装插件

npm i html-webpack-plugin -D

     3.修改 webpack.config.js 配置文件

// 1. 引入插件
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    plugins: [
      
      
       	// 2. 配置打包HTML的插件
        new HtmlWebpackPlugin({
            template: "./public/index.html",// 指定html模板文件。
            inject: "body",// 将打包生成的JS文件放置在body尾部
            hash: true,// 在引入JS时增加hash后缀字符串,去除缓存。
            filename:'index.html'
            minify: {
                removeAttributeQuotes: true,// 移除属性中的双引号
                removeComments: true,// 移除注释
                collapseWhitespace: true,// 去除空格与换行
            }
        })
      
    ]
}

       4.执行打包命令

npx webpack  # 打包产生的页面自动引入js打包文件

        5.静态资源要相对根目录查找,需要增加一个配置

output: {
        // 3-1. 指定出口文件的目录
        path: path.resolve(__dirname, '../dist'),
        // 3-2. 指定打包后的js文件名
        filename: 'js/app.bundle.js',
        // 3-3. 重新打包,清空以前的内容,重新生成
        clean: true,
        // 3-4. 静态资源目录
        publicPath:'/'
    },

5-1. 如何查看打包后的效果

  • 方式一:在vscode中,以dist为根目录代开项目。这样liveserver 模拟的服务器 5500端口的根目录就是dist目录
  • 方式二:
    • 安装一个 serve 包,用它来模拟服务器,它可以指定根目录启动服务
    • npm i -g serve
    • 指定目录启动:
    • serve 网站根目录名
    • 举例:serve dist
  • 根目概念:
    • 项目根目路:指的是src所在目录
    • 网站根目录:build之后的目录。当我们通过网址访问的时候,去哪个目录查找资源

7,打包JS

7-1:JS语法转换

问题:一些浏览器(尤其是IE)对ES6新语法的支持不够(不兼容), 但前端开发基本都在用ES6+的语法

解决:利用babel相关工具包将 ES6 转换为 ES5

Babel可以将浏览器不能识别的新语法(ES6-11)转换成原来识别的老语法(ES5),浏览器JS兼容性处理。 操作流程:

1,安装babel相关工具包

npm install -D babel-loader @babel/core @babel/preset-env
  • @babel/core babel 的核心库 (本身并不能完成 ES6 转 ES5)
  • @babel/preset-env babel 的预设工具包,将 ES6 新语法转为 ES5
  • babel-loader babel 在 webpack 中的 loader 包

babel 插件包: 每个 ES6 的新语法都有一个对应的 babel 插件包来转换为对应的 ES5 语法

babel 预设包: 包含多个常用的 babel 插件包的一个大的集合包 ==> 简化配置

2,配置 loader

module.exports = {
    module: {
        rules: [
  		    //配置 babel 的 loader
            {
                test: /\.js$/,
                exclude: /node_modules/, // 不进行处理的文件夹
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['@babel/preset-env'], // 指定bebel预设包
      				   plugins: [], // 指定babel插件包
                    }
                }
            },
          
        ]
    }
}

 3,设置目标浏览器

问题:webpack5 打包生成的 JS 代码默认是被包裹在『箭头函数』中, 而IE不支持箭头函数

解决:在 package.json 配置说明兼容 IE 浏览器 => 打包文件中的箭头函数变为 function 函数

"browserslist": [
  "> 0.1%",
  "not ie <=8"
]

 4,执行打包命令

npx webpack

5,babel单独配置文件使用

 (1)在项目根目录[src所在目录]创建一个 .babelrc

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

(2)webpack.config.js

module.exports = {
    module: {
        rules: [
  		    //配置 babel 的 loader
            {
                test: /\.js$/,
                exclude: /node_modules/, // 不进行处理的文件夹
                use: 'babel-loader'
            },
          
        ]
    }
}

7-2. JS 兼容性处理

以下内容待更新....

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

进程概念【linux】

进程基础 在学习进程之前&#xff0c;首先要有一定的计算机硬件和软件基础。 硬件基础&#xff1a;冯诺依曼体系结构 如图&#xff0c;是计算机在硬件上的体系结构。 下面举出一些常见的输入输出设备&#xff08;有些设备只作输出设备&#xff0c;或者只作输入设备&#xff…

xtu oj 1328 数码和

题目描述 一个10进制数n在2∼16进制下可以得到的不同的数码和&#xff0c;求在这些数码和中出现次数最多的数码和。 比如20&#xff0c; 其中数码和2和4分别出现了3次&#xff0c;为最多出现次数。 输入 第一行是一个整数T(1≤T≤1000)&#xff0c;表示样例的个数。 以后每行…

【数据结构(十一·多路查找树)】B树、B+树、B*树(6)

文章目录 1. 二叉树 与 B树1.1. 二叉树存在的问题1.2. 多叉树 的概念1.3. B树 的基本介绍 2. 多叉树——2-3树2.1. 基本概念2.2. 实例应用2.3. 其他说明 3. B 树、B树 和 B*树3.1. B树 的介绍3.2. B树 的介绍3.2. B*树 的介绍 1. 二叉树 与 B树 1.1. 二叉树存在的问题 二叉树…

计算机视觉(P2)-计算机视觉任务和应用

一、说明 在本文中&#xff0c;我们将探讨主要的计算机视觉任务以及每个任务最流行的应用程序。 二、图像内容分类 2.1. 图像分类 图像分类是计算机视觉领域的主要任务之一[1]。在该任务中&#xff0c;经过训练的模型根据预定义的类集为图像分配特定的类。下图是著名的CIFAR…

大数据技术之Hive(超级详细)

第1章 Hive入门 1.1 什么是Hive Hive&#xff1a;由Facebook开源用于解决海量结构化日志的数据统计。 Hive是基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张表&#xff0c;并提供类SQL查询功能。 本质是&#xff1a;将HQL转化成MapReduce程序 …

TensorFlow学习笔记--(4)神经网络模型-数据集预处理

神经网络初步 以scikit-leran鸢尾花为例 通过scikit-learn库自带的鸢尾花数据集 来测试数据的读入 from sklearn import datasets from pandas import DataFrame import pandas as pdx_data datasets.load_iris().data # .data返回iris数据集所有输入特征 y_data dataset…

【51单片机系列】proteus中创建16x16LED点阵

本文参考来源&#xff1a; Proteus8.6中16x16LED点阵制作教程【Proteus】16乘16点阵滚动播放 文章目录 一、测试proteus中的8x8点阵驱动方式1.1 测试电流通过方向1.2 测试行列控制接口 二、使用proteus中的8x8点阵制作16x16LED点阵三、测试制作的16x16LED点阵四、使用自制的16x…

06 python 文件基础操作

6.1 .1文件读取操作 演示对文件的读取 # 打开文件 import timef open(02_word.txt, r, encoding"UTF-8") print(type(f))# #读取文件 - read() # print(f读取10个字节的结果{f.read(10)}) # print(f读取全部字节的结果{f.read()})# #读取文件 - readLines() # lines…

Python——数据库操作

目录 &#xff08;1&#xff09;安装Flask-SQLAlchemy &#xff08;2&#xff09;使用Flask-SQLAlchemy操作数据库 &#xff08;3&#xff09;连接数据库 •创建数据表 •增加数据 •查询数据 •更新数据 •删除数据 Flask-SQLAlchemy是Flask中用于操作关系型数据库的扩展…

JavaEE:单例模式(饿汉模式和懒汉模式)精讲

前言 什么是单例模式&#xff1f; 其实用通俗的话就是程序猿约定俗成的一些东西&#xff0c;就比如如果你继承了一个抽象类&#xff0c;你就要重写里面的抽象方法&#xff0c;如果你实现了一个接口&#xff0c;你就要重写里面的方法。如果不进行重写&#xff0c;那么编译器就会…

Android BottomSheetBehavior(底部弹窗)

目录 一、BottomSheetBehavior 介绍 二、BottomSheetBehavior 基本使用 2.1 在 CoordinatorLayout 中添加底部工作表&#xff1a; 2.2 在代码中获取 BottomSheetBehavior 实例&#xff1a; 2.3 设置工作表的状态&#xff0c;如展开、折叠等 2.4 工作表的状态 三、Bottom…

redis-学习笔记(Jedis zset 简单命令)

zadd & zrange zadd , 插入的第一个参数是 zset , 第二个参数是 score, 第三个参数是 member 成员 内部依据 score 排序 zrange 返回 key 对应的 对应区间内的值 zrangeWithScore 返回 key 对应的 对应区间内的值和分数 示例代码 zcard 返回 key 对应的 zset 的长度 示例代…

cannot add foreign key constraint问题的解决

cannot add foreign key constraint问题的解决 01 发生场景 当我给mysql数据库表加外键的时候 02 异常发生原因及其解决方式 添加外键时要注意几个关键点&#xff0c;否则很容易失败 1.数据类型一定要一致 添加外键的项和参考项的数据类型一定要一样&#xff0c;这里我报错…

05-命令模式

意图&#xff08;GOF定义&#xff09; 将一个请求封装为一个对象&#xff0c;从而使你可用不同的请求对客户端进行参数化&#xff0c;对请求排队或者记录日志&#xff0c;以及可支持撤销的操作。 理解 命令模式就是把一些常用的但比较繁杂的工作归类为成一组一组的动作&…

深入理解Java虚拟机---Java内存模型

JMM Java内存模型主内存和工作内存volatile Java内存模型 Java内存模型是Java虚拟机规范中试图定义一种Java内存模型(JMM)来屏蔽掉各种硬件和操作系统的内存访问差异&#xff0c;以实现让Java程序在各种平台上都能达到一致的内存访问效果。可以理解为JMM定义一套在多线程读写共…

一进一出两线制(三线制)模拟量高速信号(50KHz)隔离变送器

一进一出两线制(三线制)模拟量高速信号(50KHz)隔离变送器 型号&#xff1a;JSD TA-2311F系列 产品特点&#xff1a; ◆小体积,低成本,标准 DIN35mm 导轨安装方式 ◆三端隔离(输入、输出、工作电源间相互隔离) ◆高速信号采集,隔离等(-3dB,Min≤ 3.5 uS) ◆高精度等级(0.1% F.S&…

Netty详细文档

Netty教程 文章目录 Netty教程 Netty简介Netty 的介绍Netty 的应用场景互联网行业游戏行业大数据领域其它开源项目使用到 Netty Netty 的学习资料参考 Java BIO编程I/O 模型BIO、NIO、AIO 使用场景分析Java BIO 基本介绍Java BIO 工作机制Java BIO 应用实例问题分析 Java NIO编…

curl+postman 在java开发中的使用(提高效率)

概念 curl 是一个常用的命令行工具&#xff0c;用于发送各种类型的 HTTP 请求&#xff0c;包括 GET、POST、PUT、DELETE 等。它也可以用来下载文件、上传文件、设置 cookie、发送 multipart/form-data 等等。 使用 调用post接口 实际中的接口&#xff1a; curl --location…

Reactor线程模型详解

文章目录 传统的阻塞式 I/OReactor 模式单 Reactor 单线程单Reactor多线程主从Reactor多线程 在目前的线程模型中一种是传统阻塞的I/O模型&#xff0c;一种是Reactor线程模型。 传统的阻塞式 I/O 为了同时处理多个客户端的请求&#xff0c;服务端为每一个连接都会分配一个新的…

XSS防御:内容安全策略 CSP工作原理、配置技巧与最佳实践

前言 公司部门安全合规改造计划&#xff0c;要求所有的Web站点统一添加CSP规则。对于CSP机制我只是之前在应付面试的时候背过相关的概念&#xff0c;并没有真正在项目中实践过。所以希望借助本次改造任务好好理解并实践CSP机制。 什么是CSP CSP的全称是 Content Security Po…