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

目录

  • 一、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);

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

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

相关文章

【Python数据分析】Python常用内置函数(二)

&#x1f389;欢迎来到Python专栏~Python常用内置函数&#xff08;二&#xff09; ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;Python学习专栏 文章作者技术和水平有限&#xff0c;如果文…

小程序 获取用户头像、昵称、手机号的组件封装(最新版)

在父组件引入该组件 <!-- 授权信息 --><auth-mes showModal"{{showModal}}" idautnMes bind:onConfirm"onConfirm"></auth-mes> 子组件详细代码为: authMes.wxml <!-- components/authMes/authMes.wxml --> <van-popup show…

GuLi商城-前端基础Vue

MVVM思想 M&#xff1a;即Model&#xff0c;模型&#xff0c;包括数据和一些基本操作 V&#xff1a;即View&#xff0c;视图&#xff0c;页面渲染结果 VM&#xff1a;即View-Model&#xff0c;模型与视图间的双向操作&#xff08;无需开发人员干涉&#xff09; Vue.js - 渐…

【计算机视觉|人脸建模】3D人脸重建基础知识(入门)

本系列博文为深度学习/计算机视觉论文笔记&#xff0c;转载请注明出处 一、三维重建基础 三维重建&#xff08;3D Reconstruction&#xff09;是指根据单视图或者多视图的图像重建三维信息的过程。 1. 常见三维重建技术 人工几何模型仪器采集基于图像的建模描述基于几何建模…

Python:给MySQL创建1000张表和创建1张有50个字段的表

1、创建1000张表 import pymysqldbhost "10.1.1.143" dbuser "root" dbpassword "123456" dbname "demo_cg1000" dbport 3306 dbconn pymysql.connect(hostdbhost, userdbuser, passworddbpassword, dbdbname, portdbport)mycu…

Ansible单yaml文件部署Zabbix5.0监控平台

文章目录 Ansible单yaml文件部署Zabbix5.0监控平台节点规划案例实施基础环境准备编写剧本文件ZabbixWeb界面(1)改中文(2)添加监控主机 Ansible单yaml文件部署Zabbix5.0监控平台 节点规划 IP主机名节点192.168.200.10ansibleAnsible节点192.168.200.20zabbix-serverZabbix-ser…

【Python系列】Python基础语法轻松入门—从变量到循环

目录 写在前面 语法介绍 变量 数据类型 整数 浮点数 字符串 列表 元组 字典 运算符 算术运算符 比较运算符 逻辑运算符 条件语句 循环语句 图书推荐 图书介绍 参与方式 中奖名单 写在前面 Python 是一种高级、解释型的编程语言&#xff0c;具有简单易学…

iPhone 安装 iOS 17公测版(Public Beta)

文章目录 步骤1. 备份iPhone资料步骤2. 申请iOS 17 公测Beta 资格步骤3. 下载iOS 16 Beta 公测描述档步骤4. 选择iOS 17 Beta 公测描述档更新项目步骤5. 升级iOS 17 Public Beta 公开测试版 苹果已经开始向大众释出首个iOS 17 公开测试版/ 公测版( iOS 17 Public Beta)&#xf…

【javaSE】 面向对象程序三大特性之继承

目录 为什么需要继承 继承的概念 继承的语法 注意事项 父类成员访问 子类中访问父类的成员变量 子类和父类不存在同名成员变量 子类和父类成员变量同名 访问原则 子类中访问父类的成员方法 成员方法名字不同 总结&#xff1a; 成员方法名字相同 总结&#xff1a; …

AAOS 音频焦点请求

文章目录 前言基本概念提供给应用来获取音频焦点的apiAAOS中的音频焦点管理交互矩阵duck的实现流程AAOS 测试应用kitchensink焦点相关 前言 本文章的目标是首先了解Android中音频焦点的基本概念&#xff0c;理解代码中相关音频焦点的使用方法。其次理解AAOS 中相关交互矩阵概念…

ns3.39编译时报错与解决_包括netanim-3.109(NetAnim)

ns&#xff08;来源于“network simulator”&#xff09;是一系列离散事件网络模拟器&#xff0c;包括ns-1、ns-2和ns-3。他们主要应用于研究和教学。ns-3是自由软件&#xff0c;以GNU GPLv2协议分发。​——百度百科 熟悉ns的朋友都知道&#xff0c;使用build.py编译时会先编…

线性代数的学习和整理2:线性代数的基础知识(整理ing)

目录 0 写在前面的话 网上推荐的线性代数的课程 1 线性代数和矩阵的各种概念 1.1 各种逻辑图 2 关于线性代数入门的各种灵魂发问 2.1 什么是线性&#xff0c;什么是线性相关 &#xff1f; 为什么叫线性变换&#xff1f; 为什么叫线性代数&#xff1f; 2.2 线性代数是人造…

搞活系列-Java NIO之偏偏不用buffer.flip()会出现什么问题?

最近看博客又看到了Java NIO相关的博客&#xff0c;其中有讲解NIO和传统IO关于文件复制的文章&#xff0c;看到了如下的代码&#xff1a; /**** channel用例* 基于channel的文件复制*/Testpublic void fileCopyByChannel(){try {FileInputStream fileInputStream new FileInpu…

黑苹果如何在macOS Sonoma中驱动博通网卡

准备资源&#xff08;百度&#xff1a;黑果魏叔 下载&#xff09; 资源包中包含&#xff1a;AirportBrcmFixup.kext/IOSkywalkFamily.kext/IO80211FamilyLegacy.kext/OpenCore-Patcher 使用方法&#xff1a; 1.将 csr-active-config 设置为 03080000 全选代码 复制 2.在 …

如何进行软件回归测试

什么是软件回归测试&#xff0c;如何进行回归测试&#xff0c;进行回归测试时有哪些常用的方法&#xff1f; 回归测试是指修改了旧代码后&#xff0c;重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误的一种测试方法。回归测试是指重复以前的全部或部分的相同功能…

2,认识N(logN)的排序【p3】

认识N( logN} 的排序 2.1归并排序2.1.1代码实现归并排序2.1.1.1自己c实现归并排序2.1.1.2gptc实现归并排序2.1.1.3总结2.1.1.4比较行为 2.1.2归并排序使用master公式2.1.3归并排序的扩展2.1.3.1小和问题2.1.3.2逆序对问题 2.2快排、荷兰国旗问题2.2.1问题一2.2.2问题二(荷兰国旗…

数电基础知识学习笔记

文章目录&#xff1a; 一&#xff1a;逻辑门 1.逻辑门电路的分类 1.1 按逻辑&#xff08;逻辑门&#xff09; 1.1.1 逻辑定义 1.1.2 常见数字电路相关符号 1.1.3 电路图表示 1.1.4 逻辑门电路图像符号 1.2 按电路结构 1.3 按功能特点 2.高低电平的含义 3.常见的门…

C#实现数据库数据变化监测(sqlservermysql)

监测数据库表数据变化&#xff0c;可实现数据库同步&#xff08;一主一从&#xff08;双机备份&#xff09;&#xff0c;一主多从&#xff08;总部数据库&#xff0c;工厂1&#xff0c;工厂2&#xff0c;工厂数据合并到总部数据&#xff09;&#xff09; sqlserver 启用数据库…

uni-app在小米手机上运行【步骤细节】

注意细节重点&#xff1a; 1.手机使用数据线与电脑连接&#xff0c;手机连接模式必须是传输文件模式 2.手机必须打开开发者模式 3.打开开发者模式后&#xff0c;仔细浏览并调整USB调试权限&#xff0c;重点打开USB是否允许安装按钮&#xff01;&#xff01;&#xff01; 操作步…

黄东旭:The Future of Database,掀开 TiDB Serverless 的引擎盖

在 PingCAP 用户峰会 2023 上&#xff0c; PingCAP 联合创始人兼 CTO 黄东旭 分享了“The Future of Database”为主题的演讲&#xff0c; 介绍了 TiDB Serverless 作为未来一代数据库的核心设计理念。黄东旭 通过分享个人经历和示例&#xff0c;强调了数据库的服务化而非服务化…