第5集丨webpack 江湖 —— 项目发布 和 source map

news2025/1/17 8:55:56

目录

  • 一、webpack项目发布
    • 1.1 新增发布(build)命令
    • 1.2 优化js和图片文件的存放路径
    • 1.3 执行
    • 1.4 效果
  • 二、clean-webpack-plugin插件
    • 2.1 安装
    • 2.2 配置
    • 2.3 执行
  • 三、source map
    • 3.1 配置
    • 3.2 生成的source map文件
  • 四、定义@符
    • 4.1 配置
    • 4.2 使用
  • 五、工程附件汇总
    • 5.1 webpack.config.js
    • 5.2 package.json
    • 5.3 index.html
    • 5.4 index.js
    • 5.5 index.css
    • 5.6 index.less
    • 5.7 babel.config.js
    • 5.8 msg.js
    • 5.9 func.js

一、webpack项目发布

1.1 新增发布(build)命令

修改package.json,在scripts 中,新增如下命令。--mode 指定参数,会覆盖webpack.config.js中的mode配置项。

 "scripts": {
    "build":"webpack --mode production"
  },

1.2 优化js和图片文件的存放路径

修改webpack.config.js 文件

  • 修改output.filename 节点信息为js/bundle.js,这样生成的bundle.js就会多一层js目录
  • 修改url-loader的参数,增加outputPath=images ,这样生成的图片就会存放在images目录下
module.exports = {
    output: {
        path: path.join(__dirname,'./dist'),
        filename: 'js/bundle.js'
    },
    
    module: {
      rules: [
        {
          test: /\.(png|jpg|gif)$/,
          use : 'url-loader?limit=475&outputPath=images'
        }
      ]
    }
}

1.3 执行

执行命令:npm run build

D:\A_MyWork\M05.MYCode\vscode\javascript\webpack>npm run build

> webpack@1.0.0 build
> webpack --mode production

asset js/bundle.js 90.4 KiB [emitted] [minimized] (name: main) 1 related asset
asset images/69e95a243e6176428cfb2acc554b762a.png 5.45 KiB [emitted] [immutable] [from: src/images/logo.png] (auxiliary name: main)
asset ./index.html 354 bytes [emitted]
runtime modules 1.81 KiB 6 modules
orphan modules 2.44 KiB [orphan] 3 modules
cacheable modules 291 KiB
  modules by path ./node_modules/ 286 KiB
    modules by path ./node_modules/style-loader/dist/runtime/*.js 5.84 KiB
      ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js 2.42 KiB [built] [code generated]
      + 5 modules
    modules by path ./node_modules/css-loader/dist/runtime/*.js 2.31 KiB
      ./node_modules/css-loader/dist/runtime/noSourceMaps.js 64 bytes [built] [code generated]
      ./node_modules/css-loader/dist/runtime/api.js 2.25 KiB [built] [code generated]
    ./node_modules/jquery/dist/jquery.js 278 KiB [built] [code generated]
  modules by path ./src/ 4.19 KiB
    ./src/index.js + 3 modules 3.22 KiB [built] [code generated]
    ./node_modules/css-loader/dist/cjs.js!./src/css/index.css 462 bytes [built] [code generated]
    ./node_modules/css-loader/dist/cjs.js!./node_modules/less-loader/dist/cjs.js!./src/css/index.less 536 bytes [built] [code generated]
webpack 5.88.2 compiled successfully in 5548 ms

D:\A_MyWork\M05.MYCode\vscode\javascript\webpack>

1.4 效果

最终效果,如下图所示:

在这里插入图片描述

二、clean-webpack-plugin插件

使用该插件后,每次执行发布(build)命令,会帮助我们自动删除dist目录

插件使用文档:npmjs.com 搜索clean-webpack-plugin 查看具体配置说明

2.1 安装

命令:npm install --save-dev clean-webpack-plugin

D:\A_MyWork\M05.MYCode\vscode\javascript\webpack>npm install --save-dev clean-webpack-plugin

added 17 packages in 10s

D:\A_MyWork\M05.MYCode\vscode\javascript\webpack>

2.2 配置

const { CleanWebpackPlugin } = require('clean-webpack-plugin');
module.exports = {
    plugins:[new CleanWebpackPlugin()]
}

2.3 执行

执行:npm run build,查看效果。

三、source map

source map就是一个信息文件,里面存储着位置信息。也就是,source map 文件中存储着压缩混淆后的代码,所对应的转换前的位置。有了它,出错的时候,控制台将直接显示原始代码,而不是转换后的代码,能够极大的方便后期的调试。

3.1 配置

修改webpack.config.js ,新增devtool 配置项,有三个值

  • eval-source-map:在开发环境下(npm run dev)使用,保证报错的行数与源代码的行数保持一致
  • nosources-source-map:生产环境下(npm run build),定位具体的报错行数,不暴露源代码
  • source-map:生产环境下,定位具体的报错行数,且暴露源代码

注意:在生产环境下,如果省略了devtool 配置项,则最终生成的文件不包含Source Map。这能够防止源代码通过Source Map的形式暴露。

webpack.config.js

module.exports = {
    mode:'development',
    // 开发环境下使用,保证报错的行数与源代码的行数保持一致
    devtool: 'eval-source-map',
    // 生产环境下,定位具体的报错行数,不暴露源代码
    devtool: 'nosources-source-map',
    // 生产环境下,定位具体的报错行数,且暴露源代码
    devtool: 'source-map',

package.json

"scripts": {
    "dev": "webpack serve",
    "build": "webpack --mode production"
  },

3.2 生成的source map文件

生成source map文件,如下图所示

在这里插入图片描述

四、定义@符

使用场景:当我们引用文件时候,使用../../这种模式,当文件目录很深的时候,就很不方便我们查找。

解决方案:使用 @ 符号,表示src目录,从外往里找。不要使用../从里往外找

4.1 配置

修改webpack.config.js ,新增resolve.alias 配置项,定义 @的指向。下面的规则说明:@符号表示src这一层目录

module.exports = {
	resolve: {
	      alias: {
	        // 告诉webpack,@符号表示src这一层目录
	        '@':path.join(__dirname,'./src/')
	      }
	    }
}

4.2 使用

之后,我们就可以使用@符号了,如下所示:

// import msg from '../../msg.js'
import msg from '@/msg.js'

import '@/css/index.css'
import '@/css/index.css'
import '@/js/test/func.js'


五、工程附件汇总

最终,此次工程的目录结构如下:

在这里插入图片描述

5.1 webpack.config.js

// 导入node.js中专门操作路径的模块
const path = require("path")    
const HtmlWebpackPlugin = require('html-webpack-plugin')
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
// 创建插件的实例对象
const htmlPlugin = new HtmlWebpackPlugin({
    // 指定复制源文件的路径
    template:'./src/index.html',
    // 指定创建文件的生成路径
    filename:'./index.html'
})
module.exports = {
    mode:'development',
    // 开发环境下使用,保证报错的行数与源代码的行数保持一致
    // devtool: 'eval-source-map',
    // 生产环境下,定位具体的报错行数,不暴露源代码
    // devtool: 'nosources-source-map',
    // 生产环境下,定位具体的报错行数,且暴露源代码
    // devtool: 'source-map',
    // 打包入口的文件路径,__dirname表示当前文件的存放路径,即工程路径
    entry:path.join(__dirname,'./src/index.js'),
    output: {
        // 输出文件的存放路径
        path: path.join(__dirname,'./dist'),
        // 输出文件的名称
        filename: 'js/bundle.js'
    },
    devServer: {
        static: {
          directory: path.join(__dirname, "/"),
        },
        // compress: true,
        port: 8080,
        host:'127.0.0.1',
        open:true
      },
    plugins:[htmlPlugin,new CleanWebpackPlugin()],
    module: {
      // 定义了不同模块的loader
      rules: [
        {
          test: /\.css$/i,
          use: ["style-loader", "css-loader"],
        },
        {
          test: /\.less$/i,
          use: [
            // compiles Less to CSS
            'style-loader',
            'css-loader',
            'less-loader',
          ],
        },
        {
          test: /\.(png|jpg|gif)$/,
          // 如果loader只有一个,只传递一个字符串即可
          use : 'url-loader?limit=475&outputPath=images'
        },{
          test: /\.m?js$/,
          // 必须使用exclude指定排除项,因为node_modules目录下的第三方包不需要被打包,无需程序员关心,程序员只需要把自己的代码转换即可
          exclude: /(node_modules|bower_components)/,
          use:'babel-loader'
        }
      ]
    },
    resolve: {
      alias: {
        // 告诉webpack,@符号表示src这一层目录
        '@':path.join(__dirname,'./src/')
      }
    }
}

5.2 package.json

{
  "name": "webpack",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev": "webpack serve",
    "build": "webpack --mode production"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "jquery": "^3.7.0"
  },
  "devDependencies": {
    "@babel/core": "^7.22.9",
    "@babel/plugin-proposal-decorators": "^7.22.7",
    "babel-loader": "^9.1.3",
    "clean-webpack-plugin": "^4.0.0",
    "css-loader": "^6.8.1",
    "file-loader": "^6.2.0",
    "html-webpack-plugin": "^5.5.3",
    "less": "^4.1.3",
    "less-loader": "^11.1.3",
    "style-loader": "^3.3.3",
    "url-loader": "^4.1.1",
    "webpack": "^5.88.2",
    "webpack-cli": "^5.1.4",
    "webpack-dev-server": "^4.15.1"
  }
}

5.3 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>
    <!-- <script src="./index.js"></script> -->
    <!-- 加载和引用内存里的bundle.js -->
    <!-- <script src="/bundle.js"></script> -->
</head>
<body>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
        <li>6</li>
        <li>7</li>
        <li>8</li>
        <li>9</li>
    </ul>
    <img src="" alt="" id="img"/>
</body>
</html>

5.4 index.js

import $ from 'jquery'
import './css/index.css'
import './css/index.less'
// 如果某个模块中,使用from接受到的成员为 undefined ,则没必要进行接受
import logo from './images/logo.png'

import '@/js/test/func.js'
$(function () {
    $("#img").attr("src",logo)
    $("li:odd").css('background-color','red')
    $("li:even").css('background-color','pink')
})

function info(target) {
    target.info = "Person info."
}

@info
class Person{}

consle.log(Person.info);

5.5 index.css

li {
    list-style: none;
}

5.6 index.less

* {
    margin: 0;
    padding: 0;
    li {
        line-height: 30px;
        padding-left: 20px;
        font-size: 12px;
    }
}

5.7 babel.config.js

module.exports = {
    // 声明 babel 可用插件
    // 将来,webpack 在调用 babel-loader 的时候,会先加载 plugins 插件来使用
    "plugins": [
        ["@babel/plugin-proposal-decorators", { "version": "legacy" }]
    ]
}

5.8 msg.js

export default {
    msg:'hello msg js'
}

5.9 func.js

import msg from '@/msg.js'
console.log(msg);

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

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

相关文章

大麦订单一键生成 仿大麦订单生成

后台一键生成链接&#xff0c;独立后台管理 教程&#xff1a;修改数据库config/Conn 不会可以看源码里有教程 下载程序&#xff1a;https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3

强化学习(EfficientZero)(应用于图像和声音)

目录 摘要 1.背景介绍 2.MCTS&#xff08;蒙特卡洛树搜索&#xff09;&#xff08;推理类模型&#xff0c;棋类效果应用好&#xff0c;控制好像也不错&#xff09; 3.MUZERO 4.EfficientZero&#xff08;基于MUZERO&#xff09; 展望 参考文献 摘要 在文中&#xff0c;基于…

【雕爷学编程】MicroPython动手做(20)——掌控板之三轴加速度5

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

数学建模 好文章和资源推荐

数学建模入门篇(0基础必看&#xff0c;全是自己的经验) 【竞赛|数学建模】Part 1&#xff1a;什么是数学建模和各模块介绍 0基础小白&#xff0c;如何入门数学建模&#xff1f; 数学建模入门篇(0基础必看&#xff0c;全是自己的经验) 什么是数学建模 重申了一下题目&#xff…

基于SpringBoot+Vue的地方废物回收机构管理系统设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

并发编程——线程池

1.概述 如果并发的线程过多&#xff0c;而且执行的时间都非常短&#xff0c;如果这样&#xff0c;每次都要创建线程就会大大降低效率&#xff0c;我们可以通过线程池来解决&#xff0c;JDK5增加了内置线程池ThreadPollExecutor。 2.线程池的优点 1.重复利用&#xff0c;降低…

【LeetCode】单链表——刷题

你曾经灼热的眼眶&#xff0c;是人生中少数的笨拙又可贵的时刻。 文章目录 1.反转单链表 题目思路及图解 代码中需要注意的问题 2.移除链表元素 题目思路及图解 代码中需要注意的问题 大家好&#xff0c;我是纪宁。 这篇文章分享给大家一些经典的单链表leetcode笔试题的…

【Unity 实用插件篇】 | 行为状态机StateMachine,规范化的管理对象行为

前言【Unity 实用插件篇】 | 行为状态机StateMachine 学习使用一、StateMachine行为状态机 介绍二、StateMachine 结构分析三、StateMachine状态机详细使用流程3.1 第一步:创建状态机Transition Table SO3.2 第二步:创建对应状态的 State SO3.3 第三步:创建状态的切换条件 C…

Hadoop学习指南:探索大数据时代的重要组成——运行环境搭建

Hadoop运行环境搭建&#xff08;开发重点&#xff09; 模板虚拟机环境准备 数据来源层 安装模板虚拟机&#xff0c;IP地址192.168.10.100、主机名称hadoop100、内存4G、硬盘50G hadoop100 虚拟机配置要求如下&#xff08;本文Linux系统全部以CentOS-7.5-x86-1804为例&#…

小研究 - Java 虚拟机实现原理分析

针对虚拟机的底层实现原理及相关实现过程&#xff0c;讨论了 Java 语言的跨平台原理以及相关工作机制&#xff0c;分析了 JVM 底层各数据区内存管理过程&#xff0c;阐述了 JVM 在 Java 语言中的核心作用以及重要地位。 目录 1 概述 2 Java 平台分层原理 3 虚拟机工作原理 …

CDC一键入湖:当 Apache Hudi DeltaStreamer 遇见 Serverless Spark

文章目录 1. 整体架构2. 环境准备3. 配置全局变量4. 创建专属工作目录和存储桶5. 创建 EMR Serverless Execution Role6. 创建 EMR Serverless Application7. 提交 Apache Hudi DeltaStreamer CDC 作业7.1 准备作业描述文件7.2 提交作业7.3 监控作业7.4 错误检索7.5 停止作业 8…

仿转转闲鱼链接后台生成

教程&#xff1a;修改数据库账号密码直接使用。 源码带有教程! 下载程序&#xff1a;https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3

TIA博途中通过UDT实现IO地址映射到DB块中的具体方法

TIA博途中通过UDT实现IO地址映射到DB块中的具体方法 如下图所示,打开TIA博途,新建一个项目,添加一个PLC UDT数据类型Iomap,数据类型为Array[0…49] of Byte, 如下图所示,再添加一个全局DB块,在DB块中添加一个变量map,数据类型为Iomap, 如下图所示,在PLC变量表中添加一…

iOS开发-NotificationServiceExtension实现实时音视频呼叫通知响铃与震动

iOS开发-NotificationServiceExtension实现实时音视频呼叫通知响铃与震动 在之前的开发中&#xff0c;遇到了实时音视频呼叫通知&#xff0c;当App未打开或者App在后台时候&#xff0c;需要通知到用户&#xff0c;用户点击通知栏后是否接入实时音视频的视频或者音频通话。 在…

【微服务】springboot整合mongodb使用详解

目录 一、mongodb简介 1.1 什么是mongodb 1.2 mongodb特点 二、mongodb中的核心术语 2.1 mogodb与数据库对比 2.2 mongodb中的核心概念 2.3 与关系数据库的差异 2.3.1 半结构化 2.3.2 支持多级嵌套 2.3.3 关系弱化 三、mongodb 技术优势和应用场景 3.1 mongodb 技术…

redis主从复制哨兵Cluster

目录 前言 一、模式介绍 1.1 主从复制 1.2 哨兵 1.3 集群 二、主从复制 2.1 主从复制的作用 2.2 主从复制流程 2.3 搭建Redis 主从复制 三、Redis 哨兵模式 3.1 哨兵模式原理 3.2 哨兵模式的作用 3.3 哨兵组成结构 3.4 哨兵故障转移机制 3.5 搭建Redis 哨兵模式…

利用频谱仪进行简单的2.4G 频率测试

一、概述 1. 信号源 我们开发2.4G 无线产品的时候&#xff0c;经常需要对产品的无线信号进行测试&#xff0c;以确定精确的频率。在进行频率测试之前&#xff0c;我们的2.4G 射频芯片需要进入单载波模式。 2. 频谱仪 这里选择的是普源的频谱仪。测试范围是 9kHz - 3.2GHz。…

【工具篇】Lombok 介绍及使用(详细教程)

Lombok 介绍及使用 一&#xff0c;Lombok介绍 在 Java 开发中&#xff0c;常常需要编写大量的getter、setter方法、equals和hashCode方法、构造函数等重复且繁琐的代码。 为了减少 Java 代码中的冗余和样板代码&#xff0c;提高代码的可读性和开发效率&#xff0c;就有了Lomb…

数据结构: 线性表(无哨兵位单链表实现)

文章目录 1. 线性表的链式表示: 链表1.1 顺序表的优缺点1.2 链表的概念1.3 链表的优缺点1.4 链表的结构 2. 单链表的定义2.1 单链表的结构体2.2 接口函数 3. 接口函数的实现3.1 动态申请一个结点 (BuySListNode)3.2 单链表打印 (SListPrint)3.3 单链表尾插 (SListPushBack)3.4 …

【雕爷学编程】MicroPython动手做(20)——掌控板之三轴加速度6

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…