webpack5搭建与基本配置

news2024/11/17 7:29:46

 webpack基础构建

  • 新建文件夹进入文件夹
  • 查看是否安装node,命令:node-v
  • 创建package.json文件,命令:npm init -y
  • 安装webpack和webpack-cli,(命令自动创建出package-lock.json文件和node_modules文件夹)命令:npm install webpack webpack-cli --save-dev
  • npx webpack -v查看版本
  • 手动创建文件夹src,在src文件夹内创建出index.js
  • 手动创建一个webpack.config.js配置文件。
const path = require('path')//管理路径模块的包
//CommonJS语法
module.exports = {
	mode:'development',//开发模式
	entry:path.join(__dirname,'src','index.js'),
	//__dirname代表当前文件位于的目录
	//上述整行命令代表的是,整个打包的入口
	output:{
		path:path.join(__dirname,'dist'),
		//path把打包好的文件放在什么路径下
		filename:'bundle.js',
		//filename打包好的文件叫啥名
	}
}
  • 去package.json文件内“scrptis”里去配置脚本"build":"webpack"
  • 终端去输入命令:npm run build 将文件打包好
  • 在dist文件下新建一个index.html文件,然后用<script>引入bundle.js文件,直接在浏览器中打开就ok
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<p>webpack</p>
		<script src="dist/bundle.js"></script>
	</body>
</html>

 

webpack拆分配置

 首先在build文件目录下新建四个js文件 

  • 通用配置:webpack.common.js
  • dev配置: webpack.dev.js
  • prod配置:webpack.prod.js
  • 通用地址引入:paths.js

 webpack.common.js: 

const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const { srcPath, distPath } = require('./paths')

module.exports = {
    entry: path.join(srcPath, 'index'),
    plugins: [
        new HtmlWebpackPlugin({
            template: path.join(srcPath, 'index.html'),
            filename: 'index.html'
        })
    ],
}

webpack.dev.js

const path = require('path')
const webpack = require('webpack')
const webpackCommonConf = require('./webpack.common.js')
const { merge } = require('webpack-merge')
const { srcPath, distPath } = require('./paths')

module.exports = merge(webpackCommonConf, {
    mode: 'development',
    devServer: {
        historyApiFallback: true,
        static: distPath,
        open: true,
        compress: true,
        hot: true,
        port: 8080,

        // 设置代理 —— 如果有需要的话!
        proxy: {
            // 将本地 /api/xxx 代理到 localhost:3000/api/xxx
            '/api': 'http://localhost:3000',

            // 将本地 /api2/xxx 代理到 localhost:3000/xxx
            '/api2': {
                target: 'http://localhost:3000',
                pathRewrite: {
                    '/api2': ''
                }
            }
        }
    },
    plugins: [
        new webpack.DefinePlugin({
            // window.ENV = 'production'
            ENV: JSON.stringify('development')
        })
    ]
})

 webpack.prod.js :

const path = require('path')
const webpack = require('webpack')
const { CleanWebpackPlugin } = require('clean-webpack-plugin')
const webpackCommonConf = require('./webpack.common.js')
const { merge } = require('webpack-merge')
const { srcPath, distPath } = require('./paths')

module.exports = merge(webpackCommonConf, {
    mode: 'production',
    output: {
        filename: 'bundle.[contenthash:8].js',  // 打包代码时,加上 hash 戳
        path: distPath,
        // publicPath: 'http://cdn.abc.com'  // 修改所有静态文件 url 的前缀(如 cdn 域名),这里暂时用不到
    },
    plugins: [
        new CleanWebpackPlugin(), // 会默认清空 output.path 文件夹
        new webpack.DefinePlugin({
            // window.ENV = 'production'
            ENV: JSON.stringify('production')
        })
    ]
})
  • 安装插件  :
npm install -D webpack-dev-server
npm i html-webpack-plugin
npm i clean-webpack-plugin
npm i webpack-merge
  • 在src目录下新建index.html

 index.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>
    <p class="wes">webpack demo5</p>
</body>
</html>

执行命令:npm run dev启动项目

执行命令:npm run build打包

当前package.json文件:

{
  "name": "webpack",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev-without-dev-server": "webpack --config build/webpack.dev.js",
    "dev": "webpack serve --config build/webpack.dev.js",
    "build": "webpack --config build/webpack.prod.js"
  },
  "keywords": [],
  "author": "Seven_Ting",
  "license": "ISC",
  "devDependencies": {
    "webpack": "^5.88.1",
    "webpack-cli": "^5.1.4",
    "webpack-dev-server": "^4.15.1"
  },
  "dependencies": {
    "clean-webpack-plugin": "^4.0.0",
    "html-webpack-plugin": "^5.5.3",
    "webpack-merge": "^5.9.0"
  }
}

webpack处理样式

  • 首先安装插件:
npm i style-loader css-loader postcss-loader less-loader -D
npm i less -D
npm i autoprefixer -D
  • 新建文件 postcss.config.js

module.exports = {
    plugins: [require('autoprefixer')]
}

  • 处理样式写在公共配置文件里webpack.common.js:
  •  在webpack.common.js文件中的module对象的rules数组中配置css样式相关

{
    test: /\.css$/,
    // loader 的执行顺序是:从后往前
    use: ['style-loader', 'css-loader', 'postcss-loader'] 
    // 加了 postcss
},
{ 
    test: /\.less$/,
    // 增加 'less-loader' ,注意顺序
    use: ['style-loader', 'css-loader', 'less-loader']
}
  •  在src目录下新建两个css文件

index.css:  

body{
    background: green;
}

index2.less:

.wes{
    font-size: 50px;
    color: aliceblue;
}

执行命令npm run dev:

 执行命令npm run build:

 注意:

        1、样式loader是从后往前一步一步解析的

        2、打包后的css文件是直接在html的<script>标签中去插入css样式的

        3、postcss-loader是用作浏览器兼容性的,几乎兼容所有浏览器

webpack处理ES6

注意:需要去webpack.common.js文件里的利用babel-loader,处理babel需要配置一个文件叫.babelrc

  •  安装插件:
npm i babel-loader -D
npm i @babel/core -D
npm i @babel/preset-env -D
  • 新建文件.babelrc

  •  .babelrc:
{
    "presets": ["@babel/preset-env"],
    "plugins": []
}
  • webpack.common.js: 的module对像的rules数组内配置

{
    test: /\.js$/,
    use: ['babel-loader'],
    include: srcPath,
    exclude: /node_modules/
},

测试:

  • 新建math.js文件

export const sum = (a, b) => {
    return a + b
}
  •  在index.js文件中编码

import { sum } from './math'
const sumRes = sum(10, 20)
console.log('sumRes', sumRes)

const print = (info) => {
    console.log(info)
}
print('hello webpack 5')

 运行npm run dev

webpack处理图片

webpack.dev.js 线下图片处理

在webpack.dev.js文件的model.rules直接引入

  • 安装插件:
sudo cnpm install file-loader -D
  • webpack.dev.js代码: 

 

{
    test: /\.(png|jpg|jpeg|gif)$/,
    use: 'file-loader'
}

测试dev: 

  • 新建文件夹src.img加入两张图片

 

  • 在index.js文件中引入:

// 引入图片
function insertImgElem(imgFile) {
    const img = new Image()
    img.src = imgFile
    document.body.appendChild(img)
}
import imgFile1 from './img/img1.jpg'
insertImgElem(imgFile1)
import imgFile2 from './img/img2.jpg'
insertImgElem(imgFile2)
  • 运行命令:npm run dev

webpack.prod.js线上图片处理 :

注意:配置线上图片时可以将小于多少的图片打包成为一个base64格式的图片,这样能减少浏览器访问速度,提高性能

  • 安装插件:
sudo cnpm i url-loader -D
  • webpack.prod.js代码:

{
    test: /\.(png|jpg|jpeg|gif)$/,
    use: {
        loader: 'url-loader',
        options: {
            limit: 50 * 1024,
            outputPath: '/img1/',
        }
    }
},

 测试:

  • 执行npm run build打开打包文件的index.html

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

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

相关文章

残差网络(ResNet) -深度学习(Residual Networks (ResNet) – Deep Learning)

在第一个基于cnn的架构(AlexNet)赢得ImageNet 2012比赛之后&#xff0c;每个随后的获胜架构都在深度神经网络中使用更多的层来降低错误率。这适用于较少的层数&#xff0c;但当我们增加层数时&#xff0c;深度学习中会出现一个常见的问题&#xff0c;称为消失/爆炸梯度。这会导…

MachineLearningWu_6_FeatureScaling

x.1 feature scale 接下俩我们将考虑数据的不一致性&#xff0c;例如有的数据的范围很大&#xff0c;可能分布在好几千&#xff0c;但是我们的weight矩阵最好是在[-1, 1]的小数&#xff0c;如果数值太大就会导致我们的weight变化也很大&#xff0c;如下面这个例子就并不好&…

编译型语言和解释型语言的区别

1.操作系统怎么识别编程语言 计算机能识别二进制数&#xff0c;但是无法识别编程语言&#xff0c;比如你把 01000001100通过相关手段输入计算机中计算机就能识别其中的含义并且执行对应的命令&#xff0c;但是你输入 print(hello world)计算机就无法识别其含义&#xff0c;这就…

基于springboot+mybatis-plus+mysql+vue音乐网站管理系统

基于springbootmybatis-plusmysqlvue音乐网站管理系统 一、系统介绍1、系统主要功能&#xff1a;2.涉及技术框架&#xff1a;3.项目说明&#xff1a; 二、功能展示三、其它系统四、获取源码 一、系统介绍 1、系统主要功能&#xff1a; 音乐播放 用户登录注册 用户信息编辑、头…

4. PS切图

4.1常见的图片格式 jpg图像格式: JPEG ( .JPG )对色彩的信息保留较好,高清,颜色较多,我们产品类的图片经常用jpg格式的gif图像格式 : GIF格式最多只能储存256色,所以通常用来显示简单图形及字体,但是可以保存透明背景和动画效果,实际经常用于一些图片小动画效果png图像格式&am…

Tomcat 线程池

目录 概述 tomcat线程池工作原理 关键源码 Connector 配置 Executor 线程配置 tomcat核心组件&#xff08;题外&#xff09; 概述 Tomcat 是一个流行的 Java Web 服务器&#xff0c;它使用线程池来处理客户端请求。线程池是一组预先创建的线程&#xff0c;用于执行并发任…

FreeRTOS ~(七)互斥量 ~ (1/3)互斥量解决互斥缺陷

前情提要 FreeRTOS ~&#xff08;四&#xff09;同步互斥与通信 ~ &#xff08;2/3&#xff09;互斥的缺陷 FreeRTOS ~&#xff08;五&#xff09;队列的常规使用 ~ &#xff08;2/5&#xff09;队列解决互斥缺陷 FreeRTOS ~&#xff08;六&#xff09;信号量 ~ &#xff08;2/…

Android Camera2 获取RAW数据

这边文章主要记录下在Android系统上&#xff0c;如何通过Camera2 API去拿到RAW数据&#xff0c;也是当个备忘。 平时我们拿实时预览数据&#xff0c;更多的是获取yuv数据。一般涉及到raw域算法在APP层实现的时候&#xff0c;我们才会用到获取raw数据。 APP上集成Raw算法的思路…

【CSDN新星计划】初阶牛C/C++赛道——顺序程序设计(运算符和表达式)

目录 &#x1f349;2.运算符和表达式 2.1 C运算符 2.2基本的算术运算符 2.3自增&#xff08; &#xff09;自减&#xff08; - - &#xff09;运算符 2.4算术表达式和运算符的优先级与结合性 2.运算符和表达式 2.1 C运算符 C语言提供了以下运算符&#xff1a; (1)算术…

印度反垄断机构偏袒亚马逊,谷歌对滥用安卓市场地位罚款提出质疑

根据路透社消息&#xff0c;谷歌指控印度反垄断机构在其安卓系统调查中对亚马逊持偏袒态度&#xff0c;并向印度最高法院提起诉讼&#xff0c;对其关于滥用安卓市场地位的罚款提出质疑。 印度竞争委员会&#xff08;CCI&#xff09;最近要求谷歌改变商业模式&#xff0c;称谷歌…

结合具体场景举例说明chatgpt预训练模型中Tokenization的原理

假设我们有一个场景&#xff0c;Alice想向Chatbot询问一部电影的推荐。她发送了一条消息&#xff1a;“你好&#xff0c;能给我推荐一部好看的电影吗&#xff1f;” 在这个场景中&#xff0c;Chatbot使用了ChatGPT预训练模型。首先&#xff0c;Chatbot需要对Alice的消息进行Tok…

【力扣周赛】第 108 场双周赛

文章目录 Q1&#xff1a;6913. 最长交替子序列思路竞赛时代码代码优化 Q2&#xff1a;6469. 重新放置石块思路竞赛时代码 Q3&#xff1a;6923. 将字符串分割为最少的美丽子字符串解法1—— dfs回溯 剪枝 判断解法2——动态规划 Q4&#xff1a;6928. 黑格子的数目代码优化 成绩…

Jenkins持续集成

文章目录 Jenkins介绍Jenkins的特征 Jenkins架构Gitlab安装1. Gitlab代码托管服务器安装2. Gitlab添加组、创建用户、创建项目 jenkins安装安装JenkinsJenkins插件管理Jenkins用户权限管理Jenkins凭证管理安装Git插件和Git工具设置SSH免密登录 Maven安装和配置JenkinsDockerspr…

【数据结构】栈和队列详解

⭐️ 往期相关文章 ✨链接1&#xff1a;数据结构和算法的概念以及时间复杂度空间复杂度详解 ✨链接2&#xff1a;【数据结构】手撕顺序表 ✨链接3&#xff1a;【数据结构】手撕单链表 ✨链接4&#xff1a;【数据结构】双向带头循环链表 ⭐️ 栈和队列 &#x1f320; 栈 栈是…

react-native项目手机预览

初始化项目 使用 expo 初始化 react-native 项目&#xff0c;https://reactnative.cn/docs/environment-setup 运行项目 执行 start 命令运行项目 拿起你的iPhone手机&#xff0c;安装 expo APP&#xff0c;https://expo.dev/client 或者到 APP store 搜索下载。下载完成之…

基于TCP协议的聊天系统TCP-ChatSystem

基于TCP协议的点对点聊天系统 网络协议&#xff1a;TCP 聊天形式&#xff1a;点对点 所用技术&#xff1a;socket、多路转接、线程池、互斥锁、条件变量、MFC等。 功能点&#xff1a;注册、登录、添加好友、聊天等。 实现示意图 客户端登陆注册消息流转图&#xff1a; 客…

【MATLAB第54期】基于LSTM长短期记忆网络的多输入多输出滑动窗口回归预测模型

【MATLAB第54期】基于LSTM长短期记忆网络的多输入多输出滑动窗口回归预测模型 往期第13期已实现多输入单输出滑动窗口回归预测 本次在此代码基础上&#xff0c;新增多输出滑动窗口功能。 多输入单输出滑动窗口回归预测 一、实现效果 往期文章提到了对单列时间序列数据进行滑…

spdlog入门教程(1)

spdlog入门教程&#xff08;1&#xff09; 文章目录 spdlog入门教程&#xff08;1&#xff09;1、前言1.1 为什么要使用日志库1.2 尽量使用通用日志框架而不要自己实现1.3 spdlog概述1.4 地址 2、源码编译配置spdlog3、在Qt中使用spdlog1.1 验证spdlog是否配置成功1.2 将日志输…

全网最牛,Pytest自动化测试-pytest.mark.parametrize参数化实战(详细)

目录&#xff1a;导读 前言 一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 pytest允许在多个…

删除数据库记录错误

删除数据库记录错误&#xff1a;Unexpected update count received (Actual: 2, Expected: 1). All changes will be rolled back. 解决&#xff1a;同时删掉ID为8的记录就行了 分析&#xff1a;这种情况是未设置主键约束&#xff0c;插入了相同的记录导致的。推测应该是框架对…