webpack打包一个文件,做了哪些事情

用webpack打包一个文件,在webpack内部做了哪些事情,用代码详细介绍一下

当你使用 Webpack 打包一个文件时,Webpack 内部会进行一系列操作来实现模块加载、代码转换、依赖分析、模块打包等功能。以下是使用 Webpack 打包一个简单 JavaScript 文件时,Webpack 内部可能会做的一些事情,以及对应的代码示例:

  1. 解析入口文件和依赖

    • Webpack 首先会解析指定的入口文件,分析文件中的依赖关系。

      // entry.js
      import dependency from './dependency.js';
      console.log('Hello from entry file');
      
  2. 依赖分析和模块解析

    • Webpack 会递归地分析入口文件和其依赖的模块,构建模块之间的依赖图。

      // dependency.js
      export default "Hello from dependency file";
      
  3. 加载器和转换

    • 如果有配置加载器(loader),Webpack 会根据配置对模块内容进行加载和转换。

      // webpack.config.js
      module.exports = {module: {rules: [{test: /\.js$/,use: 'babel-loader',exclude: /node_modules/}]}
      };
      
  4. 插件执行

    • Webpack 会触发各阶段生命周期事件,执行各插件中定义的逻辑。

      // webpack.config.js
      const MyPlugin = {apply(compiler) {compiler.hooks.run.tap('MyPlugin', compilation => {console.log('Webpack is running...');});}
      };
      module.exports = {plugins: [MyPlugin]
      };
      
  5. 输出文件

    • 最终,Webpack 会生成打包后的文件,包含打包后的代码和资源。

      // 输出的打包后文件
      // 包含经过转换和打包后的代码
      (function(modules) {// Webpack 实现的模块加载函数...
      })({"entry.js": function(module, exports, __webpack_require__) {var dependency = __webpack_require__("dependency.js");console.log('Hello from entry file');},"dependency.js": function(module, exports) {module.exports = "Hello from dependency file";}
      });
      

以上是使用 Webpack 打包一个简单 JavaScript 文件时,Webpack 内部可能会做的一些事情,并提供了相应的代码示例来说明。Webpack 的内部流程非常复杂,包含了更多的细节和处理过程,但以上代码示例可以帮助你初步了解 Webpack 内部的一些核心功能和流程。

用webpack打包一个文件,在webpack内部做了哪些事情,用代码详细介绍一下,其中着重讲解一下加载loader和plugins做了什么

当使用 Webpack 打包一个文件时,Webpack 内部会进行一系列操作,其中加载 loader 和执行 plugins 是重要的步骤。下面是一个详细的代码示例,展示 Webpack 在加载 loader 和执行 plugins 这两个阶段的具体操作:

假设有以下文件结构:

  • src/index.js:入口文件
  • src/utils.js:一个需要通过 loader 转换的模块

Webpack 配置文件 webpack.config.js

const path = require('path');
module.exports = {entry: './src/index.js',output: {path: path.resolve(__dirname, 'dist'),filename: 'bundle.js',},module: {rules: [{test: /\.js$/,use: 'babel-loader',exclude: /node_modules/,},],},plugins: [function MyPlugin() {this.apply = compiler => {compiler.hooks.beforeRun.tap('MyPlugin', () => {console.log('MyPlugin is running before the compilation starts...');});};},],
};
  1. 加载 loader(babel-loader)

    • 当 Webpack 遇到文件需要通过 loader 处理时,会根据配置中的规则来加载对应的 loader,对模块内容进行转换。
  2. 执行 plugins

    • 在 Webpack 执行过程中,会触发不同的生命周期钩子,插件可以通过这些钩子来执行各种操作。在下面的示例中,我们定义了一个简单的插件 MyPlugin,在 Webpack 的 beforeRun 钩子中打印一条消息。

下面是一个文件的示例内容:

src/index.js

import message from './utils.js';console.log(message);

src/utils.js

export default 'Hello, from utils!';

在运行 Webpack 打包时,Webpack 内部会按照以下顺序执行:

  • 加载入口文件 src/index.js,通过 loader 处理其中的依赖和代码;
  • 加载模块 src/utils.js,同样通过 loader 处理;
  • 执行插件 MyPlugin 中定义的操作,在编译开始之前打印消息;
  • 最终输出打包后的 bundle.js 文件到 dist 文件夹中。

通过以上示例,可以看到 Webpack 在加载 loader 和执行 plugins 这两个阶段的工作过程,以及如何通过配置文件来控制和定制这些步骤。加载 loader 可以实现对模块内容的转换,而执行 plugins 则可以在不同的编译阶段执行自定义逻辑,从而灵活扩展和控制 Webpack 的打包过程。

用代码详细介绍loader可以做什么

Loader 是 Webpack 中用于将非 JavaScript 模块转换为 JavaScript 模块的工具。它们允许你在 import 或 require 模块的时候预处理文件。以下是一个简单的示例,演示了 loader 可以做的一些事情:

假设有一个简单的文本文件 data.txt

Hello, this is some text from data.txt file.

现在我们使用一个自定义的 loader reverse-text-loader 来对 data.txt 中的文本内容进行翻转处理,并将翻转后的内容导入到 JavaScript 文件中。以下是示例代码:

  1. 创建 reverse-text-loader.js,用于定义 loader 的转换逻辑:

    // reverse-text-loader.js
    module.exports = function(source) {// 将文本内容进行反转处理return source.split('').reverse().join('');
    };
    
  2. 配置 Webpack 使用自定义的 loader:

    // webpack.config.js
    const path = require('path');module.exports = {entry: './src/index.js',output: {path: path.resolve(__dirname, 'dist'),filename: 'bundle.js',},module: {rules: [{test: /\.txt$/,use: path.resolve(__dirname, 'reverse-text-loader.js'),},],},
    };
    
  3. 创建一个入口文件 index.js,并导入 data.txt 文件:

    // index.js
    import reversedText from './data.txt';console.log(reversedText);
    
  4. 运行 Webpack 进行打包:

当运行 Webpack 时,它会使用我们定义的 reverse-text-loaderdata.txt 中的文本内容进行翻转处理,最后输出翻转后的内容到 bundle.js 文件中。在这个示例中,我们展示了 loader 可以做的一件事情:对导入的文件内容进行处理,并将处理后的内容转换为 JavaScript 模块。

通过以上示例,你可以看到 loader 的作用是非常灵活的,你可以根据需求自定义 loader 来处理不同类型的文件,实现各种转换和增强功能,从而扩展 Webpack 的打包能力。

loader有哪些类型,分别做什么,用代码解释

Webpack 中的 Loader 可以用于对不同类型的模块进行转换处理,从而让 Webpack 能够处理各种不同格式的文件。以下是一些常见的 Loader 类型以及它们的作用,同时提供一些代码示例来说明它们的用途:

  1. babel-loader:将 ES6+ 代码转换为 ES5 代码,使得现代 JavaScript 代码能够在不同环境中运行。
// webpack.config.js
module: {rules: [{test: /\.js$/,exclude: /node_modules/,use: {loader: 'babel-loader',options: {presets: ['@babel/preset-env']}}}]
}
  1. style-loader 和 css-loader:用于处理 CSS 文件,将 CSS 转换为 JavaScript 模块,以便在浏览器中动态加载样式。
// webpack.config.js
module: {rules: [{test: /\.css$/,use: ['style-loader', 'css-loader']}]
}
  1. file-loader 和 url-loader:处理文件资源,如图片、字体等,将其转换为 URL 或 base64 格式。
// webpack.config.js
module: {rules: [{test: /\.(png|jpg|gif)$/,use: [{loader: 'file-loader',options: {name: '[name].[ext]',outputPath: 'images/'}}]}]
}
  1. url-loader:类似于 file-loader,但可以根据文件大小决定是返回 base64 格式还是 URL 格式。
// webpack.config.js
module: {rules: [{test: /\.(png|jpg|gif)$/,use: [{loader: 'url-loader',options: {limit: 8192 // 文件大小小于 8KB 时返回 base64 格式}}]}]
}
  1. sass-loader 和 less-loader:处理 SCSS 或 LESS 文件,将其转换为 CSS。
// webpack.config.js
module: {rules: [{test: /\.scss$/,use: ['style-loader', 'css-loader', 'sass-loader']}]
}

以上是一些常见的 Loader 类型及其作用,通过配置不同类型的 Loader,可以实现对各种不同格式的文件进行处理和转换,从而扩展 Webpack 的功能和应用范围。不同类型的 Loader 可以根据需要组合使用,以适应项目中不同类型的模块处理需求。

Webpack源码有哪些功能模块,都是做什么的,用代码详细介绍

Webpack 的源码包含多个重要功能模块,下面我将详细介绍每个模块的作用,并给出相应的代码示例来说明它们的功能:

  1. Parser(解析器):解析模块代码,分析模块之间的依赖关系。
const { Parser } = require('webpack');const parser = new Parser();// 解析模块代码
const ast = parser.parseModule('import example from "./example.js";');
  1. DependencyGraph(依赖图):构建模块之间的依赖关系图,确定加载顺序。
const { DependencyGraph } = require('webpack');const depGraph = new DependencyGraph();// 构建依赖关系图
const dependencies = depGraph.addModuleDependencies(module, dependencies);
  1. NormalModuleFactory(普通模块工厂):创建模块对象,并加载依赖模块。
const { NormalModuleFactory } = require('webpack');const moduleFactory = new NormalModuleFactory();// 创建模块对象
const module = moduleFactory.create(data, callback);
  1. Chunk(代码块):生成代码块,代表一组模块的集合。
const { Compilation } = require('webpack');const chunk = new Compilation().addChunk('main');// 将模块添加到代码块
chunk.addModule(module);
  1. Resolver(解析器):根据模块请求的路径,确定模块的绝对路径。
const { ResolverFactory } = require('webpack');const resolver = ResolverFactory.create();// 解析模块路径
const resolvedPath = resolver.resolve({}, '/path/to/module');
  1. Compiler(编译器):编译整个项目,将输入的模块转换为输出的 Chunk。
const { Compiler } = require('webpack');const compiler = new Compiler();// 运行编译器
compiler.run((err, stats) => {if (err) {console.error(err);} else {console.log(stats);}
});
  1. Plugins(插件系统):扩展 Webpack 的功能,执行自定义逻辑。
const MyPlugin = require('./my-plugin');compiler.apply(new MyPlugin());
  1. Loaders(加载器):对资源文件进行处理,将其转换为模块。
module.exports = {module: {rules: [{test: /\.js$/,use: ['babel-loader']}]}
};

以上是对 Webpack 源码中各功能模块的介绍,并给出了相应的代码示例来说明它们的作用和使用方式。这些功能模块共同构建了 Webpack 的打包流程,实现了模块的解析、依赖处理、代码生成等一系列重要功能。

用代码详细介绍plugin可以做什么,他们的原理是什么

在 Webpack 中,插件(plugins)是用来扩展和定制构建流程的工具,能够在整个构建过程中实现各种功能。插件可以监听到 Webpack 在不同阶段的生命周期事件,并在适当的时机执行自定义的逻辑,以达到特定的目的。以下是插件可以做的事情以及它们的原理:

  1. 修改输出文件内容或文件名:插件可以在生成最终输出文件时对内容进行修改,或者根据自定义规则生成不同的文件名。
// 一个简单的例子,通过修改 bundle 文件添加一行注释
class AddCommentPlugin {apply(compiler) {compiler.hooks.emit.tap('AddCommentPlugin', compilation => {for (const file of Object.keys(compilation.assets)) {compilation.assets[file] = new ConcatSource(`/* Add comment by AddCommentPlugin */\n`,compilation.assets[file]);}});}
}
  1. 优化构建结果:插件可以对输出文件进行优化,例如代码压缩、去除冗余代码、资源压缩等。
// 使用 UglifyJsPlugin 压缩 JavaScript 代码
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');module.exports = {// 其他配置plugins: [new UglifyJsPlugin()],
};
  1. 资源管理:通过插件可以对不同类型的静态资源进行处理和优化,例如文件复制、图片压缩、文件名修改等。
// 使用 CopyWebpackPlugin 复制静态资源
const CopyWebpackPlugin = require('copy-webpack-plugin');module.exports = {// 其他配置plugins: [new CopyWebpackPlugin({patterns: [{ from: 'assets', to: 'dist/assets' }],}),],
};
  1. 环境变量注入:插件可以向代码中注入全局变量或环境变量,以便在代码中使用。
// 使用 DefinePlugin 定义环境变量
const webpack = require('webpack');module.exports = {// 其他配置plugins: [new webpack.DefinePlugin({'process.env.NODE_ENV': JSON.stringify('production'),}),],
};

插件的核心原理:是基于 WebpackTapable 插件系统,插件可以利用各种生命周期钩子(hooks)来注册自定义逻辑代码,在构建过程中执行相应的操作。当 Webpack 在编译过程中触发对应的生命周期事件时,插件注册的回调函数就会被执行,从而实现对构建过程的干预和定制。

总的来说,Webpack 插件是一种扩展机制,通过监听Webpack的生命周期事件和钩子来实现对构建过程的干预和定制,使开发者能够更加灵活地定制构建流程、优化构建结果和满足项目需求。

三种注册插件的方法tapAsync、tapPromise和tap的区别是什么

在 Webpack 中,taptapAsynctapPromise 是注册插件的方法,它们的主要区别在于处理异步操作的能力和返回值类型:

  1. taptap 是最常用的注册插件的方法,用于同步执行逻辑。它注册的插件是一个普通的同步函数,无法处理异步操作。
compiler.hooks.someHook.tap('MyPlugin', (params) => {// 同步执行的插件逻辑
});
  1. tapAsynctapAsync 用于注册处理异步操作的插件。插件函数接受一个回调函数作为最后一个参数,用于通知 Webpack 异步操作的完成。
compiler.hooks.someHook.tapAsync('MyAsyncPlugin', (params, callback) => {// 异步执行的插件逻辑setTimeout(() => {callback();}, 1000);
});
  1. tapPromisetapPromise 用于注册返回 Promise 对象的插件,适用于处理异步操作且支持 Promise。插件函数返回一个 Promise 对象,Webpack 在 Promise 执行完成后继续执行下一个插件。
compiler.hooks.someHook.tapPromise('MyPromisePlugin', (params) => {return new Promise((resolve, reject) => {// 异步执行的插件逻辑setTimeout(() => {resolve();}, 1000);});
});

总结来说,tap 用于同步执行插件逻辑,tapAsync 用于处理异步操作,并通过回调函数通知 Webpack 完成,tapPromise 用于处理异步操作并返回 Promise 对象。根据插件逻辑的需要选择合适的方法进行注册插件,以确保插件可以正确地执行并与 Webpack 生态系统良好地集成。

const webpack = require('webpack');
const compiler = webpack({/* webpack配置 */
});
// 在编写插件时,通常会使用 tap 方法注册插件
// 还可以使用 tapAsync、tapPromise 等方法进行异步操作。
compiler.hooks.entryOption.tap('MyPlugin', () => {});
compiler.hooks.beforeCompile.tapAsync('MyPlugin', (params, callback) => {callback();
});
compiler.hooks.someHook.tapPromise('MyPromisePlugin', params => {return new Promise(resolve => {asyncOperation().then(() => {resolve();});});
});

什么时候用tapAsync,什么时候用tapPromise

Webpack 插件开发中,选择使用 tapAsync 还是 tapPromise 取决于插件逻辑是否需要进行异步操作,并且符合 Promise 的使用场景:

  1. 使用 tapAsync 的情况:
    • 当插件逻辑需要进行异步操作(如读取文件、发送网络请求等)且需要在操作完成后通知 Webpack 继续执行下一个插件时,应该选择 tapAsync
    • 如果插件的逻辑中包含异步回调函数,并且需要手动调用回调函数来通知 Webpack 完成插件执行时,应该使用 tapAsync
compiler.hooks.someHook.tapAsync('MyAsyncPlugin', (params, callback) => {// 异步操作asyncOperation(() => {// 操作完成后调用回调callback();});
});
  1. 使用 tapPromise 的情况:
    • 当插件逻辑中需要进行异步操作,并且适合使用 Promise 来管理异步流程时,应该选择 tapPromise
    • 如果插件逻辑中的异步操作返回 Promise 对象,可以直接返回 Promise 来告知 Webpack 异步操作的完成,此时应该使用 tapPromise
compiler.hooks.someHook.tapPromise('MyPromisePlugin', (params) => {return new Promise((resolve, reject) => {// 异步操作asyncOperation().then(() => {resolve();}).catch((error) => {reject(error);});});
});

总的来说,根据插件逻辑是否需要异步操作、是否符合 Promise 的使用场景来选择 tapAsynctapPromise。合理选择合适的注册方法可以使插件逻辑更清晰、更容易维护,并与 Webpack 插件系统良好地结合。

webpack 所有的生命周期钩子,详细讲解

Webpack 提供了多个生命周期钩子(Lifecycle Hooks)来让开发者介入打包流程,实现定制化的打包逻辑。以下是Webpack中常用的生命周期钩子及其作用:

  1. beforeRun:在 Webpack 构建启动之前执行的钩子,此时 Webpack 准备开始读取配置并启动构建过程。

  2. run:Webapck 构建启动后、创建编译对象之前执行的钩子,表示编译即将开始。

  3. watchRun:当使用 watch 模式下执行的钩子,表示每次重新编译前将会执行。

  4. normalModuleFactory:用于创建模块工厂时执行的钩子,可以用来改变模块创建方法。

  5. contextModuleFactory:用于创建上下文模块工厂时执行的钩子,可以用来改变上下文模块创建方法。

  6. beforeCompile:在编译开始之前执行的钩子,在这里可以执行一些操作以准备编译过程。

  7. compile:编译开始时执行的钩子,表示 Webpack 正在处理模块及其依赖。

  8. thisCompilation:在每次新的编译中,生成新的 Compilation 对象之前调用。

  9. compilation:在每次新的编译开始时创建新的 Compilation 对象时执行,表示一个新的编译已经开始。

  10. make:在开始创建块之前执行的钩子。

  11. afterCompile:在编译完成后执行的钩子,编译完成指 webpack 内部所有模块及其依赖已经编译完成。

  12. emit:在准备生成资源到输出目录之前执行的钩子。

  13. afterEmit:资源已经生成到输出目录后执行的钩子。

  14. done:Webpack 构建完成并且输出结果后执行的钩子。可以在这里执行一些清理工作或者输出构建信息。

这些生命周期钩子可以用于开发插件,通过监听不同的生命周期钩子并注册相应的回调函数来实现对Webpack构建过程的定制化操作。通过灵活运用这些生命周期钩子,开发者可以扩展Webpack的功能,满足项目特定的需求。

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

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

相关文章

svn介绍 4.0

一、svn介绍(版本控制工具) 1、svn的定义: svn是一个开放源代码的版本控制系统,通过采用分支管理系统的高效管理,简而言之就是用于多个人共同开发同一个项目,实现共享资源,实现最终集中式个管…

电脑数据丢失是什么原因 易我数据恢复软件下载 easyrecovery数据恢复软件下载 电脑数据删除了怎么恢复 电脑数据库损坏了怎么找回

目录 一、电脑数据丢失是什么原因 二、电脑数据丢失如何恢复 三、EasyRecovery恢复电脑数据的方法介绍 电脑是我们大家熟悉并且常用的数据存储设备,也是综合性非常强的数据处理设备。对于电脑设备来讲,最主要的数据存储介质是硬盘,电脑硬…

CMU15445实验总结(Spring 2023)

CMU15445实验总结(Spring 2023) 背景 菜鸟博主是2024届毕业生,学历背景太差,导致23年秋招无果,准备奋战春招。此前有读过LevelDB源码的经历,对数据库的了解也仅限于LevelDB。奔着”有对比才能学的深“的理念,以及缓解…

linux系统Jenkins工具配置webhook自动部署

Jenkins工具webhook自动部署 webhook自动部署webhook的意义操作流程jenkins页面操作gitlab页面操作 webhook自动部署 webhook的意义 自动化部署:Webhook 可以在代码提交、合并请求或其他特定事件发生时自动触发 Jenkins 构建和部署任务,从而实现自动化…

C#,K中心问题(K-centers Problem)的算法与源代码

1 K中心问题(K-centers Problem) k-centers problem: 寻找k个半径越小越好的center以覆盖所有的点。 比如:给定n个城市和每对城市之间的距离,选择k个城市放置仓库(或ATM或云服务器),以使城市…

【JavaEE进阶】 Spring AOP源码简单剖析

文章目录 🍃前言🍀Spring AOP源码剖析⭕总结 🍃前言 前面的博客中,博主对代理模式进行了一个简单的讲解,接下来博主将对Spring AOP源码进行简单剖析,使我们对Spring AOP了解的更加深刻。 🍀Sp…

leetcode 简单

1. 两数之和 两数之和 方法1:暴力枚举 两次for 循环,记录索引和值,找到合适的值然后返回 方法2:使用哈希表 第一次for循环的时候,就可以使用哈希表记录key的value,可以实现时间复杂度是1,要分…

【前端素材】推荐优质后台管理系统网页Highdmin平台模板(附源码)

一、需求分析 1、系统定义 后台管理系统是一种用于管理和控制网站、应用程序或系统的管理界面。它通常被设计用来让网站或应用程序的管理员或运营人员管理内容、用户、数据以及其他相关功能。后台管理系统是一种用于管理网站、应用程序或系统的工具,通常由管理员使…

express+mysql+vue,从零搭建一个商城管理系统7--文件上传,大文件分片上传

提示:学习express,搭建管理系统 文章目录 前言一、安装multer,fs-extra二、新建config/upload.js三、新建routes/upload.js四、修改routes下的index.js五、修改index.js六、新建上传文件test.html七、开启jwt验证token,通过login接…

Vue.js+SpringBoot开发开放实验室管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实验管理模块2.4 实验设备模块2.5 实验订单模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示五、样例代码5.1 查询实验室设备5.2 实验放号5.3 实验预定 六、免责说明 一、摘…

vue3的router

需求 路由组件一般放在&#xff0c;pages或views文件夹, 一般组件通常放在component文件夹 路由的2中写法 子路由 其实就是在News组件里面&#xff0c;再定义一个router-view组件 他的子组件&#xff0c;机会渲染在router-view区域 路由传参 <RouterLink :to"/news…

解决导入项目后在idea中不显示的问题

问题&#xff1a; 今天下午重新打开寒假之前负责的项目&#xff0c;发现打不开了&#xff0c; 从master拉取最新代码到我的分支&#xff0c;发现我的分支上显示就是这样子&#xff0c;无论怎么更新代码都不行。 原因&#xff1a; 在上一次上传代码的时候&#xff0c;我把我分…

leetcode括号生成

题目描述 解题思路 首先看到题目&#xff0c;一开始是并没有思路的。这时候可以在纸上进行演算一下结果。当只有一对括号的时候&#xff0c;我们可以得知结果[“()”],当有两对括号的时候&#xff0c;我们可以发现&#xff0c;括号在第一个基础上&#xff0c;要么在括号内部出…

静态时序分析:SDC约束命令set_case_analysis详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 目录 指定值 指定端口/引脚列表 简单使用 set_case_analysis命令用于对电路进行特定模式的设定&#xff0c;例如对于一个工作在正常模式下的芯片&#xff0c;…

HTML5新特性:为Web带来的翻天覆地变化

随着互联网的发展&#xff0c;HTML5作为Web开发的重要里程碑&#xff0c;为我们带来了一系列令人兴奋的新特性和功能。本文将带领大家探索HTML5的新特性&#xff0c;揭示其对Web技术的巨大影响。 一、介绍 HTML5作为HTML的最新版本&#xff0c;不仅强化了网页结构与内容&#…

Android 解决引入的三方库中类名冲突问题

参考&#xff1a; Android开发——如何解决三方库中的类名冲突问题_android 类冲突-CSDN博客 Android 解决 jar/aar 包类名冲突 - 简书 实操步骤 1.提前安装好unzip-5.51-bin&#xff0c;proguard-7.4.0&#xff0c;jarjar-1.4软件 2.解压包名冲突的 AAR 文件 进入到需要修…

reach功能的使用

1.reach添加后 1.reach添加后2 2.拷贝reach最后一帧的动作 3.删除reach(注意画选时如果reach延长不能直接删否则以前的动画也会删掉&#xff0c;要缩短reach后再删另外这两个灰原点也要删掉否则影响后边新加clip的对齐会出现乱七八糟的事情) 4.删除reach后&#xff0c;光标移到…

收藏:数据防泄漏系统推荐,数据防泄漏系统有哪些?

一金融机构在近期发生了一起数据泄露事件。 经过调查&#xff0c;发现是由于一名员工将包含客户敏感信息的文件通过电子邮件发送给了未经授权的第三方。 这一事件导致客户数据泄露&#xff0c;给该机构带来了严重的声誉损失和信任危机。 这一案例凸显了数据防泄漏系统的重要性…

Neo4j aura 官方网站快速入门新手教精读-从官方教程学习知识图谱

Neo4j 官方网站快速入门新手教精读 本文旨在为Neo4j新手提供一份全面的入门指南。除了基础的文本解释&#xff0c;我在里面还插入了每一步骤的详细截图或者自己画的图&#xff0c;从官方了解知识肯定比自己乱看要权威一些&#xff0c;有看不懂的不要纠结了解大概意思即可&#…

Java中心校智慧校园智慧班牌物联网平台源码

目录 智慧班牌 班牌首页 班级信息 课表信息 视频 图片 进离校管理 人脸登录页 学生个人中心 请假管理 成绩管理 家长留言 学生绑卡 学生评价 系统设置 通知管理 值日管理 倒计时 班级德育 班牌模式 1.课堂授课模式 2.家长会签到模式 3.考场模式 4.班级…