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.pswp.cn/news/714478.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714478.shtml
英文地址,請注明出處:http://en.pswp.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.班級…