初识rollup 打包、配置vue脚手架

news2024/9/27 6:57:38

rollup javascript 代码打包器,它使用了 es6 新标准代码模块格式。

特点:

  1. 面向未来,拥抱 es 新标准,支持标准化模块导入、导出等新语法。
  2. tree shaking 静态分析导入的代码。排除未实际引用的内容
  3. 兼容现有的 commonJS 模块,可通过插件导入

示例项目地址

安装使用

创建示例项目

$> mkdir rollup-example
$> cd rollup-example

安装 rollup

$> npm init -y
$> npm i rollup

创建main.js 主入口文件。创建 libs目录用于方式封装的功能函数。

package.json文件中定义执行脚本命令。

  • --file 编译后的文件名称 简写 -o
  • --format 按什么标准去编译文件类型 iffe、cjs、es。 简写-f
{
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "rollup main.js --file bundle.js --format iife"
  }
}

libs创建arry.js

/**
 * 数组类型校验
 * @param {*} target
 * @returns
 */
export const isArray = (target) => {
  return Array.isArray(target);
};
/**
 * 数组去重
 * @param {*} target
 * @returns
 */
export const duplicateKill = (target) => {
  return [...new Set(target)];
};

然后在main.js 中调用

import { isArray } from "./libs/array";

//
console.log(isArray(3));
console.log(isArray("1,2,3,4"));
console.log(isArray([1, 2, 3, 4]));

执行npm run build,得到一个编译文件bundle.js

(function () {
  "use strict";

  /**
   * 数组类型校验
   * @param {*} target
   * @returns
   */
  const isArray = (target) => {
    return Array.isArray(target);
  };

  //
  console.log(isArray(3));
  console.log(isArray("1,2,3,4"));
  console.log(isArray([1, 2, 3, 4]));
})();

通过配置文件定义编译配置

上面使用了rollup 命令,并通过命令行参数指定文件以及编译类型。

定义rollup.config.js 文件,定义编译输出

// rollup.config.js

export default {
  input: "main.js",
  output: {
    file: "dist/bundle.js",
    format: "iife",
  },
};

然后修改package.json

  • --config 指定配置文件, 简写-c
  • --bundleConfigAsCjs 因为配置文件是以 .js结尾的,通常建议使用.cjs.
{
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "rollup --config rollup.config.js --bundleConfigAsCjs"
  }
}

然后执行 npm run build 可以看到 生成的dis/bundle.js

也可以省略 配置文件,rollup 会自动加载根目录下的rollup.config.js , rollup --config --bundleConfigAsCjs

多入口打包文件,配置文件可以是数组对象

会有一些多入口页面打包,通过配置入口,删除不同目录文件的编译资源

定义rollup.config.js 文件

// rollup.config.js

export default [
    {
        input: "main.js",
        output: {
            file: "dist/bundle.js",
            format: "iife",
        }
    },
    {
        input: "login.js",
        output: {
            file: "dist/login.js",
            format: "iife",
        }
    }
],

如果想要输出多个类型的编译资源output 配置为数组

// rollup.config.js

export default [
    {
        input: "main.js",
        output: [
            {
                file: "dist/bundle.js",
                format: "iife",
            },
            {
                file: "dist/bundle-es.js",
                format: "es",
            },
            {
                file: "dist/bundle-cjs.js",
                format: "cjs",
            }
        ]
    },
],

可异步请求配置文件

如果是在线配置,存储在后端。可通过请求获取配置文件。

// rollup.config.js
import ajax from "libs/ajax";
export default ajax.get("/**/**/rolleup-config");

多接口、都入口配置,则改为

// rollup.config.js
import ajax from "libs/ajax";
export default Promise.all([
  ajax.get("/**/**/rolleup-config-main"),
  ajax.get("/**/**/rolleup-config-login"),
]);

通过命令行参数适用不同的配置文件

开发坏境和生产环境有不同的配置。通过命令行参数,使用对应的配置文件。

// rollup.config.js
import devConfig from "./build/rollup.dev.config.js";
import prdConfig from "./build/rollup.prd.config.js";

export default (commandLineArgs) => {
  if (commandLineArgs.environment === "dev") {
    return devConfig;
  }
  return prdConfig;
};

修改package.json 提供 dev、build 脚本

{
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev": "rollup --config --environment dev --bundleConfigAsCjs",
    "build": "rollup --config --bundleConfigAsCjs --environment prd"
  }
}

rollup.config.js 配置文件说明

// rollup.config.js

// can be an array (for multiple inputs)
export default {
  // core input options
  external,
  input: "main.js", // 主入口文件配置路径
  plugins, // 使用插件,

  // advanced input options
  cache,
  onwarn,
  preserveEntrySignatures,
  strictDeprecations,

  // danger zone
  acorn,
  acornInjectPlugins,
  context,
  moduleContext,
  preserveSymlinks,
  shimMissingExports,
  treeshake,

  // experimental
  experimentalCacheExpiry,
  perf,

  // required (can be an array, for multiple outputs)
  output: {
    // core output options
    dir: "dist", // 编译文件目录地址,多个编译文件则必须指定
    file: "dist/bundle.js", // 编译后文件目录路径
    format, // 文件编译类型 es cjs iife
    globals,
    name,
    plugins, // 针对某些输出的插件

    // advanced output options
    assetFileNames,
    banner,
    chunkFileNames,
    compact,
    entryFileNames,
    extend,
    footer,
    hoistTransitiveImports,
    inlineDynamicImports,
    interop,
    intro,
    manualChunks,
    minifyInternalExports,
    outro,
    paths,
    preserveModules,
    preserveModulesRoot,
    sourcemap,
    sourcemapBaseUrl,
    sourcemapExcludeSources,
    sourcemapFile,
    sourcemapPathTransform,
    validate,

    // danger zone
    amd,
    esModule,
    exports,
    externalLiveBindings,
    freeze,
    indent,
    namespaceToStringTag,
    noConflict,
    preferConst,
    sanitizeFileName,
    strict,
    systemNullSetters,
  },

  watch: {
    buildDelay,
    chokidar,
    clearScreen,
    skipWrite,
    exclude,
    include,
  },
};

使用一个加载json文件的插件

安装

$> npm i --save-dev @rollup/plugin-json

在配置中使用插件

// rollup.config.js prd
import PluginJson from "@rollup/plugin-json";

export default {
  input: "main.js",
  output: {
    file: "dist/bundle.js",
    format: "iife",
  },
  plugins: [PluginJson()],
};

然后在项目中可以导入 JSON 文件,按对象取值。

import { version } from "./package.json";
// import packageJson from "./package.json";

console.log(version);

可以针对输出output 配置插件

最小化构建代码,压缩代码,安装@rollup/plugin-terser

$> npm install --save-dev @rollup/plugin-terser

修改配置文件,在编译类型为 es 的输出使用插件

// rollup.config.js dev
import PluginJson from "@rollup/plugin-json";
import PluginTerser from "@rollup/plugin-terser";

export default {
  input: "main.js",
  output: [
    {
      file: "dist/bundle.js",
      format: "iife",
    },
    {
      file: "dist/bundle-es.js",
      format: "es",
      plugins: [PluginTerser()],
    },
    {
      file: "dist/bundle-cjs.js",
      format: "cjs",
    },
  ],
  plugins: [PluginJson()],
};

执行npm run build 可以看到bundle-es.js文件代码被压缩,没有任何格式

动态加载已使用代码拆分

在以下情况会自动进行代码拆分

  • 动态加载模块
  • 多入口引入统一模块。
  • 通过输出配置output.manualChunks指定需要拆分的模块

[!] RollupError: Invalid value “iife” for option “output.format” - UMD and IIFE output formats are not supported for code-splitting builds.

编译类型 UMD、IIFE 是不支持代码拆分的。改用 cjs

实现login模块的拆分,创建 login 文件入口。然后在 main.js 文件中动态引入

import("./login.js").then(() => console.log("成功加载login..."));

需要修改配置指定编译目录dir:'dist',原来指定的 file 只是编译生成一个文件包。现在拆分代码,会生成多个编译包。

// rollup.config.js prd
import PluginJson from "@rollup/plugin-json";

export default {
  input: "main.js",
  output: {
    // file: "dist/bundle.js",
    format: "cjs",
    dir: "dist",
  },
  plugins: [PluginJson()],
};

在这里插入图片描述

定义插件,以满足定制化需求

编译时可能会需要一些定制化处理。通过自定义插件实现代码的转换。

示例实现一个移除console.log 的代码。一个插件约束

  • 插件名需要以rollup-plugin-**开头
  • package.json 中包含 rollup-plugin 关键字,构建后发布之前需要加前缀
  • 经过全面的测试。
  • 插件中尽可能的使用英文说明。
  • 尽可能的使用异步方法读取文件,比如使用 fs.readFile 而不是 fs.readFileSync
  • 插件是虚拟模块时,前缀追加\0.以便其他插件不去处理它。

项目目录下创建存储插件的位置 plugins/rollup-plugin-clear-console.js

// rollup-plugin-clear-console
import { createFilter } from "@rollup/pluginutils";

export default function clearConsole(options = {}) {
  // filter file
  var filter = createFilter(options.include, options.exclude);
  return {
    name: "clear-console",
    transform(code, id) {
      /**
       * code 为加载的文件内容
       * id 为当前内容文件的路径地址,通过filter判断是否符合处理的要求
       */
      if (!filter(id)) return;
      try {
        return {
          code: code.replace(/console\.log(\w*)/gi, ""),
          map: { mappings: "" },
        };
      } catch (err) {
        var message = "An error occurred during processing";
        this.error({ message: message, id: id, cause: err });
        return null;
      }
    },
  };
}

@rollup/pluginutils 是针对编写 rollup 插件封装的一些功能性的函数,比如示例中使用了createFilter,可以帮助过滤指定的文件、排除指定文件。

rollup.config.dev.js使用自定义插件,并制定处理目录下为main.js的文件。

// rollup.config.js prd
import PluginJson from "@rollup/plugin-json";
// 自定义插件
import PluginClearConsole from "../plugins/rollup-plugin-clear-console";

export default {
  input: "main.js",
  output: {
    // file: "dist/bundle.js",
    format: "cjs",
    dir: "dist",
  },
  plugins: [
    PluginJson(),
    PluginClearConsole({
      include: ["**/main.js"],
    }),
  ],
};

然后执行脚本,看看效果npm run dev

dis/main.js文件中可以看到所有的console.log都被移除。而且由于移除这些代码,一些导入的变量未被使用,也被 tree shaking 了。

在这里插入图片描述

可以看到拆包编译的login.js文件中还是包含有console.log代码的。

配置一起使用vue

需要安装的 vue 相关的插件, 在 rollup-awesome 官方推荐的组件库

$> npm install rollup-plugin-vue vue --save-dev

安装的都是最新版本,vue 版本为3.2.45

创建 src 目录,用于 vue 视图组件的存放位置。

// index.js
import { createApp } from "vue";

import App from "./App.vue";

const app = createApp(App);

app.mount("#app");

在项目目录下创建 index.html 文件

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>rollup-vue2</title>
  </head>
  <body>
    <div id="app"></div>
    <!-- 导入编译后的文件包 -->
    <script src="./dist/index.js"></script>
  </body>
</html>

修改 rollup 配置文件rollup.config.dev.js

// rollup.config.dev.js dev
import PluginJson from "@rollup/plugin-json";
import PluginVue from "rollup-plugin-vue";
// 自定义插件
import PluginClearConsole from "../plugins/rollup-plugin-clear-console";

export default {
  input: "./src/index.js",
  output: {
    // file: "dist/bundle.js",
    format: "es",
    dir: "dist",
  },
  plugins: [
    PluginVue(),
    PluginJson(),
    PluginClearConsole({
      include: ["**/main.js"],
    }),
  ],
};

然后执行 npm run dev ,打包编译后,通过live server启动一个服务访问 index.html

服务启动页面不展示问题

  1. 页面打开后没有任何展示,控制台报错 Cannot use import statement outside a module ,查看编译包./dist/index.js . 没有将 vue 一起打包进去。加载不到

解决,安装依赖@rollup/plugin-node-resolve ,将 vue 一起编译进去。

$> npm install @rollup/plugin-node-resolve --save-dev

修改配置,引入插件。 可以将 node_modules 中的组件包引入打包进编译包。

// rollup.config.dev.js dev
import PluginNodeResolve from "@rollup/plugin-node-resolve";

export default {
  // ... other
  plugins: [
    // ... other
    PluginNodeResolve(),
  ],
};
  1. 可以看到编译包变大了,vue 已经打包进去了,但是页面还不展示,报错Uncaught ReferenceError: process is not defined, 查看编译包./dist/index.js ,引用全局变量process.env.NODE_ENV 没有定义

解决,安装插件 @rollup/plugin-replace

$> npm install @rollup/plugin-replace --save-dev

修改配置,引入插件。 编译后替换编译包中的目标字符串。

// rollup.config.dev.js dev
import PluginReplace from "@rollup/plugin-replace";

export default {
  // ... other
  plugins: [
    // ... other
    PluginReplace({
      "process.env.NODE_ENV": JSON.stringify("development"),
      preventAssignment: true,
    }),
  ],
};

页面打开展示正常。

生成 html 文件,npm run dev创建一个服务

为了达到开发的目的,需要自动生成 html 文件,自动注入人编译后的资源包。还有其他资源的解析、加载等。

生成 html 文件

安装依赖插件,生成 index.html,并将所有编译的资源包添加到页面上。

$> npm install @rollup/plugin-html --save-dev

使用插件

// rollup.config.dev.js dev
import PluginHtml from "@rollup/plugin-html";

export default {
  // ... other
  plugins: [
    // ... other
    PluginHtml({
      title: "rollup-vue3",
      fileName: "index.html",
    }),
  ],
};

开发模式,启动 serve 服务

安装依赖插件,启动一个服务

$> npm install rollup-plugin-serve --save-dev

使用插件

// rollup.config.dev.js dev
import PluginServe from "rollup-plugin-serve";

export default {
  // ... other
  plugins: [
    // ... other
    PluginServe({
      // 运行在浏览器中
      open: true,
      // 运行成功后,打开的地址
      openPage: "/",
      // 打印服务地址
      verbose: true,
      // 地址,端口号
      // host:"::",
      host: "127.0.0.1",
      port: 8009,
      // https 协议配置
      // https: {},
      // 运行成功,事件
      onListening: function (server) {
        const address = server.address();
        const host = address.address === "::" ? "localhost" : address.address;
        // by using a bound function, we can access options as `this`
        const protocol = this.https ? "https" : "http";
        console.log(
          `Server listening at ${protocol}://${host}:${address.port}/`
        );
      },
    }),
  ],
};

运行成功后,未自动打开浏览器,serve 配置中的 open、openPage 暂时没有发现其作用
设置"::"不生效,设置为“127.0.0.1” 启动后正常打开。

--watch 监听模式,开发是文件变动重新编译

服务虽然启动了,但也仅仅是一个静态资源的服务,在开发的时候,通常需要实时编译改动的文件,希望立刻看到变化

修改启动脚本,在监听模式下,文件发生更改,就会重新编译。--watch 等同于 -w

{
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
  - "dev": "rollup --config --environment dev --bundleConfigAsCjs -w",
  + "dev": "rollup --config --environment dev --bundleConfigAsCjs",
  },
}

虽然重新编译了,但是浏览器中还是需要手动刷新才能看到变化。–需要唤起浏览器服务的插件–

解析.vue中的样式 style

在 App.vue 中书写了样式,发现在页面中没有生效

<style>
.app p {
  font-size: 32px;
}
</style>

增加插件postcss \ rollup-plugin-postcss

$> npm i postcss rollup-plugin-postcss -D

配置rollup.config.dev.js

import PluginPostCss from "rollup-plugin-postcss";

export default {
  //...
  plugins: [
    //...
    PluginPostCss(),
  ],
};

重新运行,可以看到样式生效了。默认编译后的 css 样式是注入到 html 的 head 中。

使用预编译 less

安装 less

$> npm i less -D

即可直接使用

<style lang="less">
.app {
  p {
    font-size: 32px;
    color: aqua;
  }
  button {
    color: red;
  }
}
</style>

支持 JSX 语法

比较喜欢 jsx 语法的书写方式,实现相关配置;

import { defineComponent } from "vue";

export default defineComponent({
  name: "IFunLazySelect",
  render() {
    return (
      <div class="lazy-select">
        {/* 相关代码 */}
      </div>
})

安装 @vue/babel-plugin-jsx, 还需要安装@babel/core 、@babel/preset-env

$> npm install @vue/babel-plugin-jsx @babel/core @babel/preset-env -D

新建.babelrc.js,配置

module.exports = {
  presets: [["@babel/env", { modules: false }]],
  plugins: ["@vue/babel-plugin-jsx"],
};

这只是 babel 配置,还需要集成到 rollup 中,使之生效,安装@rollup/plugin-babel

则需要修改rollup.config.base.js,增加插件配置。

// rollup.config.base.js

import PluginBabel from "@rollup/plugin-babel";

export default {
  plugins: [
    // ... other
    PluginBabel({ babelHelpers: "bundled" }),
  ],
};

重新启动项目,完美运行。

其他插件

  1. 解析 commonJS 模块,转换成 es6 模块。安装依赖
$> npm install @rollup/plugin-commonjs --save-dev

修改配置

// rollup.config.dev.js dev
import PluginCommonJS from "@rollup/plugin-commonjs";

export default {
  // ... other
  plugins: [
    // ... other
    PluginCommonJS(),
  ],
};
  1. 全局注入,比如使用 jquery,安装依赖
$> npm install @rollup/plugin-inject --save-dev

修改配置

// rollup.config.dev.js dev
import PluginInject from "@rollup/plugin-inject";

export default {
  // ... other
  plugins: [
    // ... other
    PluginInject({
      $: "jquery",
    }),
  ],
};
  1. 定义别名路径,比如通常使用@代替./src路径
$> npm install @rollup/plugin-alias --save-dev

修改配置

// rollup.config.dev.js dev
import PluginAlias from "@rollup/plugin-alias";

export default {
  // ... other
  plugins: [
    // ... other
    PluginAlias({
      entries: {
        "@": "../src",
        libs: "../libs",
      },
    }),
  ],
};
  1. 加载图片资源,.png\.jpeg\.svg
$> npm install @rollup/plugin-image --save-dev

修改配置

// rollup.config.dev.js dev
import PluginImage from "@rollup/plugin-image";

export default {
  // ... other
  plugins: [
    // ... other
    PluginImage(),
  ],
};

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

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

相关文章

Sqoop详解

目录 一、sqoop基本原理 1.1、何为Sqoop&#xff1f; 1.2、为什么需要用Sqoop&#xff1f; 1.3、关系图 1.4、架构图 二、Sqoop可用命令 2.1、公用参数&#xff1a;数据库连接 2.2、公用参数&#xff1a;import 2.3、公用参数&#xff1a;export 2.4、公用参数&#xff…

MySQL数据库和表管理

MySQL数据库和表管理一、常用的数据类型1、int(N)2、float(m,d)3、char与varchar二、查看数据库结构1、查看当前服务中的数据库2、查看数据库中存在的表3、查看表结构三、SQL语句1、SQL语言规范2、SQL语言分类四、创建、删除数据库和表1、创建数据库2、创建表3、删除数据表4、删…

云医疗信息系统源码(云HIS)商业级全套源代码

云his系统源码&#xff0c;有演示 一个好的HIS系统&#xff0c;要具有开放性&#xff0c;便于扩展升级&#xff0c;增加新的功能模块&#xff0c;支撑好医院的业务的拓展&#xff0c;而且可以反过来给医院赋能&#xff0c;最终向更多的患者提供更好地服务。 私信了解更多&…

HTTPS加密流程

什么是HTTPSHTTPS是加密后的HTTP,相当于:HTTPS HTTP SSL/TLSHTTPS是基于"密钥"来实现的,客户端将发送的数据用密钥进行加密,服务器将收到的数据用密钥解密.对称加密和非对称加密对称加密是指:交互双方共同使用同一个密钥进行加密 或 解密.如下(图中的客户端和服务器…

还不会CAD批量打印图纸?学会这招再也不怕

各位工程师&#xff0c;相信大家在工作过程中&#xff0c;经常会遇到需要打印大量图纸文件的时候&#xff0c;那么多的图纸&#xff0c;一张张打印太麻烦&#xff0c;此时便需要用到CAD批量打印功能啦&#xff01;可是&#xff0c;总有些新手设计师不直达奥CAD批量打印&#xf…

Spring事务及传播机制

概念 在MySQL中介绍过&#xff0c;当同一时间出现一起读写数据的情况&#xff0c;可能会导致最终的结果出错&#xff0c;因此可以使用事务来提高隔离级别 而Spring中也可以实现事务 手动添加事务 使用SpringBoot中的DataSourceTransactionManager对象可以获取事务&#xff0…

计算机科学导论笔记(六)

目录 八、算法 8.1 概念 8.1.1 非正式定义 8.1.2 示例 8.1.3 定义动作 8.1.4 细化 8.1.5 泛化 8.2 三种结构 8.2.1 顺序 8.2.2 判断 8.2.3 循环 8.3 算法的表示 8.3.1 UML 8.3.2 伪代码 8.4 更正式的定义 8.5 基本算法 8.5.1 求和 8.5.2 求积 8.5.3 最大和最…

Egg:使用joi进行参数校验以及注册接口小demo

目录 前言&#xff1a; 准备工作&#xff1a; 前端代码&#xff1a; 后端目录截图&#xff1a; 1.获取参数 2.校验参数 3.查询数据库中是否已经存在该用户 4.用户入库 5.测试一哈 添加用户成功 同样的用户名再注册一遍 ​编辑总结&#xff1a; 前言&#xff1a; 在阅…

C#基础之基础语法(一)

总目录 文章目录总目录前言一、C#简述1 C#是什么&#xff1f;2 .Net平台3. C# 和.Net的关系4. 集成开发环境&#xff08;IDE&#xff09;二、控制台应用程序1. 常用代码2.注意事项三、基础语法1.编写C#代码注意事项2.C#注释2. 变量&标识符&关键字4. 变量&#xff0c;字…

unity 面试汇总

1、什么是协同程序&#xff1f;答&#xff1a;在主线程运行时同时开启另一段逻辑处理&#xff0c;来协助当前程序的执行。换句话说&#xff0c;开启协程就是开启一个可以与程序并行的逻辑。可以用来控制运动、序列以及对象的行为。2、Unity3D中的碰撞器和触发器的区别&#xff…

【C++进阶】四、AVL树(二)

目录 前言 一、AVL树的概念 二、AVL树节点的定义 三、AVL树的插入 四、AVL树的旋转 4.1 左单旋 4.2 右单旋 4.3 左右双旋 4.4 右左双旋 五、AVL树的验证 六、AVL树的性能 七、完整代码 前言 前面对 map/multimap/set/multiset 进行了简单的介绍&#xff0c;在其文…

2023年湖北武汉安全员C证报考条件是什么?考试题型是什么 启程别

2023年湖北武汉安全员C证报考条件是什么&#xff1f;考试题型是什么 启程别 武汉安全员C证报考条件&#xff1a; 1.注册地在本市的施工单位在职“三类人员”可申请参加安全生产考核&#xff1b; 2、职业道德良好&#xff0c;身体健康&#xff0c;年龄不超过60周岁&#xff08…

pdf多页合并为一页方法总结,你觉得哪个最好?

PDF格式的文件在现代办公中是不可或缺的&#xff0c;许多人在工作中需要频繁处理PDF文档。然而&#xff0c;当我们需要阅读多个PDF文件时&#xff0c;不断切换不同的文件并一个一个地打开查阅会非常麻烦。为了提高阅读效率&#xff0c;人们一般会将pdf多页合并为一页。那么&…

传输线的物理基础(四):传输线的驱动和返回路径

驱动一条传输线对于将信号发射到传输线的高速驱动器&#xff0c;传输线在传输时间内的输入阻抗将表现得像一个电阻&#xff0c;相当于线路的特性阻抗。鉴于此等效电路模型&#xff0c;我们可以构建驱动器和传输线的电路&#xff0c;并计算发射到传输线中的电压。等效电路如下图…

虹科分享 | 网络流量监控 | 数据包丢失101

什么是数据包&#xff1f; 数据包是二进制数据的基本单位&#xff0c;在网络连接的设备之间编号和传输&#xff0c;无论是在本地还是通过互联网。一旦数据包到达其目的地&#xff0c;它就会与其他数据包一起按编号重新组合&#xff0c;回到最初传输的较大消息中。 数据包是我们…

2022(二等奖)C2594江淮分水岭植被碳汇时空可视化系统

作品介绍 一、需求分析 1.1 设计背景 气候变化是全球性问题&#xff0c;随着二氧化碳排放的增加生物的生存与生命受到威胁。人类活动对自然界生态系统的破坏&#xff0c;不仅降低了地球生物圈的生产力&#xff0c;威胁到人类社会未来经济的发展&#xff0c;同时还破坏了陆地与…

WireShark如何抓包,各种协议(HTTP、ARP、ICMP)的过滤或分析,用WireShark实现TCP三次握手和四次挥手

WireShark一、开启WireShark的大门二、如何抓包 搜索关键字2.1 协议过滤2.2 IP过滤2.3 过滤端口2.4 过滤MAC地址2.5 过滤包长度2.6 HTTP模式过滤三、ARP协议分析四、WireShark之ICMP协议五、TCP三次握手与四次挥手5.1 TCP三次握手实验5.2 可视化看TCP三次握手5.3 TCP四次挥手5.…

【大数据处理与可视化】一 、大数据分析环境搭建(安装 Anaconda 3 开发环境)

【大数据处理与可视化】一 、大数据分析环境搭建&#xff08;安装 Anaconda 3 开发环境&#xff09;实验目的实验内容实验步骤一、下载Anaconda安装包二、安装Anaconda3三、验证Anaconda是否安装成功四、Jupyter Notebook的使用1. 启动Anaconda自带的Jupyter Notebook2. 在code…

Volatile关键字

Volatile关键字和JMM内存模型一JUC并发包API 包介绍二JMM&#xff08;Java Memory Model&#xff09;三 volatile关键字3.1.可⻅性3.1.1.问题演示3.1.1.1案例代码3.1.1.2.案例分析3.1.2.volatile 保证可见性演示3.1.2.1对number添加了volatile修饰3.1.2.2运⾏结果是&#xff1a…

Docker学习(二十一)构建 java 项目基础镜像

目录1.下载 JDK 包2.编写 Dockerfile3.构建镜像4.创建容器测试1.下载 JDK 包 JDK各版本官网下载地址&#xff1a; https://www.oracle.com/java/technologies/downloads/archive/#JavaSE 这里我们以 JDK 8u351 为例&#xff0c;点击 Java SE (8U211 and later)。 点击下载 jd…