前端工程化基础(三):Webpack基础

Webpack和打包过程

学习webpack主要是为了了解目前前端开发的整体流程,实际开发中,我们并不需要去手动配置,因为框架的脚手架都已经帮助我们完成了配置

内置模块path

该模块在Webpack中会经常使用

从路径中获取信息

const path = require("path");
const pathStr = "D:/Mrzhang/Study/前端/node/code/zc_test/src/index.js";

//获取文件的父文件夹
console.log(path.dirname(pathStr)); //D:/Mrzhang/Study/前端/node/code/zc_test/src
//获取文件名
console.log(path.basename(pathStr)); //index.js
//获取扩展名
console.log(path.extname(pathStr));//.js

将多个路径拼接在一起(相对路径)

const path = require("path");
const pathStr1 = "./src/view";
const pathStr2 = "../index.js";
const pathStr3 = "./index.js";

console.log(path.join(pathStr1, pathStr2)); //src\index.js
console.log(path.join(pathStr1, pathStr3)); //src\view\index.js

将多个路径拼接在一起(返回绝对路径)

  • 使用 **path.resolve()**方法,进行拼接
  • 当遇到 /xxx即为终止的解析,生成绝对路径
  • 在 **resolve()**方法中,里面的路径,会从右往左进行解析,直到生成一个绝对路径就会停止
  • 在所有 路径都解析完成之后,还没有生成绝对路径,就会使用当前工作目录
  • 路径中零长度的path会被忽略
const path = require("path");

console.log(path.resolve("/src", "/txt.js")); //在"txt.js"就会停止解析 D:\txt.js
console.log(path.resolve("/src", "./txt.js")); // 在"/src"停止解析,D:\src\txt.js
console.log(path.resolve("/src/view", "../txt.js")); //D:\src\txt.js

认识Webpack

  • 官方的解释:Wevpack是一个静态的模块化打包工具,为现代的JS应用程序
  • 实际上会将我们编写的代码,打包成静态的资源
  • 打包:webpack可以帮助我们进行打包,它是一个打包工具
  • 静态:webpack可以将我们的代码打包成静态资源
  • **模块化:**webpack默认支持各种模块化开发,ESModule、CommonJS,AMD等
  • **现代的:**因为前端的不断发展,面临着各种各样的问题,催生了webpack的出现

image.png

Webpack使用前提

webpack的中文官方文档 中文文档

  • Webpack的运行是依赖Node环境的,所以电脑上需要右Node环境

Webpack的安装

  • webpack的安装目前分为两个:webpack和webpack-cli
  • webpack:主要用于代码中使用,通过代码对代码进行打包
  • webpack-cli:主要用于命令行中使用,通过命令行对代码进行打包
  • npm install webpack webpack-cli进行局部安装,若有需要可以进行全局安装

Webpack配置文件

  • 当我们在命令行执行 webpack命令,Webpack会默认去寻找目录中的 src/index.js文件
  • 并将该文件以及该文件引用的其他依赖进行打包,生成 dist文件夹,里面包含 main.js

image.png

  • 而默认的打包行为,不能满足我们的需求,因此,这时候可以在项目目录中创建webpack的配置文件 webpack.config.js
const path = require("path");

//导出配置信息
//因为webpack基于node,所以使用CommonJS
module.exports = {
    //需要对哪个文件进行打包
  entry: "./src/main.js",
    //打包后的文件名,文件夹名称以及路径
  output: {
    filename: "bundle.js",
    //这里的path需要使用绝对路径,因此需要使用node中的path模块
    path: path.resolve(__dirname, "./dist"),
  },
};
  • 当我们在命令行输入 npx webpack

    • webpack就会寻找 webpack.config.js中的配置信息,完成代码的打包
  • 而每次输入 npx webpack会很麻烦,因此,我们可以在 package.json文件中的 scripts属性进行配置

"scripts": {
    "build":"webpack"
  },
  • 之后我们就可以通过输入 npm run build进行文件的打包

css-loader的使用

Webpack默认是可以打包js文件的,但是对于其他文件在默认情况下不能进行打包

因此在打包其他文件的时候,需要用到对应文件的loader

css也不例外

  • 首先应当先安装 css-loader npm install css-loader
  • 安装完成后,需要在 webpack.config.js进行配置
    • 目的是告诉webpack在遇到 css文件的时候,使用哪个loader
    • module.exports中创建module对象
    • module对象中,创建rules规则数组
    • rules数组中,创建一个又一个的对象,用于告诉webpack识别什么文件,使用什么loader
    • 对象中,使用test设置识别的文件,use使用相关loader
    • loader有多个内容的时候,是从后往前识别的,先识别后面,再识别前面
const path = require("path");

//导出配置信息
//因为webpack基于node,所以使用CommonJS
module.exports = {
  entry: "./src/main.js",
  output: {
    filename: "bundle.js",
    //这里的path需要使用绝对路径,因此需要使用node中的path模块
    path: path.resolve(__dirname, "./dist"),
  },
  //在module设置不同文件的loader
  module: {
    //因为loader会有很多,所以采用数组的方式
    rules: [
      {
        //告诉webpack匹配什么文件
        //在后面使用正则表达式
        test: /\.css$/,
        //使用什么laoder处理,
        //使用数组类型,因为一个文件有可能使用多个loader
        //css-loader仅是可以识别css文件,并不能将样式添加进去
        //style-loader是将样式添加到元素中
        //因为先识别css-loader,所以要写在后面
        use: [{ loader: "style-loader" }, { loader: "css-loader" }],
      },
    ],
  },
};

对less文件处理

与处理css文件类似

  • 首先通过 npm install less-loader安装less-loader
  • 之后对 webpack.config.js进行配置
const path = require("path");

module.exports = {
  entry: "./src/main.js",
  output: {
    filename: "bundle.js",
    path: path.resolve(__dirname, "./dist"),
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [{ loader: "style-loader" }, { loader: "css-loader" }],
      },

      {
        //匹配less文件
        test: /\.less$/,
        //先对less文件进行解析
        //将less文件生成的css进行解析
        //最后将样式进行解析
          //这是简写
        use: ["style-loader", "css-loader", "less-loader"],
      },
    ],
  },
};

postcss-loader

这是一个工具,可以通过引入插件的方式,将我们写的css,自动做一个浏览器的适配,注意,需要安装相关插件

  • 首先使用 npm install postcss-loader安装post-loader
  • 之后在 module中引入 post-loader即可
const path = require("path");

module.exports = {
  entry: "./src/main.js",
  output: {
    filename: "bundle.js",
    path: path.resolve(__dirname, "./dist"),
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [{ loader: "style-loader" }, { loader: "css-loader" },{loader:"postcss-loader"}],
      },

      {
        //匹配less文件
        test: /\.less$/,
        //先对less文件进行解析
        //将less文件生成的css进行解析
        //最后将样式进行解析
          //这是简写
        use: ["style-loader", "css-loader", "less-loader"],
      },
    ],
  },
};

  • 但是这样引入,并不能实现 css样式浏览器适配的打包,需要安装其余的插件

  • 通过 npm install autoprefixer安装插件即可

  • 之后对 postcss-loader进行配置

const path = require("path");

module.exports = {
  entry: "./src/main.js",
  output: {
    filename: "bundle.js",
    path: path.resolve(__dirname, "./dist"),
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          { loader: "style-loader" },
          { loader: "css-loader" },
          {
            loader: "postcss-loader",
            //对某个loader进行单独的配置
            options: {
              //loader中设置使用的插件
              postcssOptions: {
                plugins: ["autoprefixer"],
              },
            },
          },
        ],
      },
      {
        test: /\.less$/,
        use: ["style-loader", "css-loader", "less-loader"],
      },
    ],
  },
};

  • 同时 postcss-loader的配置可以单独使用一个文件

  • 创建 postcss.config.js

    • 在webpack.config.js使用 **loader:“postcss-loader”**会自动查找 postcss.config.js配置文件
module.exports = {
  plugis: ["autoprefixer"],
};

//在webpack.config.js文件中,直接使用loader:"postcss-loader"即可

postcss-preset-env

上面我们用到了postcss的一个插件,而postcss-preset-env是将常用的插件集成到了一起

  • 此插件,继承了postcss常用的插件,包含上面提到过的 autoprefixer
  • 使用 npm install postcss-preset-env安装插件
  • webpack.config.js文件中使用该插件
module.exports = {
  plugis: ["post-preset-env"],
};

Webpack打包图片

在webpack环境中,每一个文件都是模块,只需要引入模块即可

import testImg from “./img/test.jpg”;

基本使用

  • 在webpack5之前对图片资源进行打包的时候,是需要安装一些loader的,raw-loader url-loader file-laoder

  • 在webpack5之后,我们可以直接使用 **资源模块类型(asset module type)**来替代上面的loader,即不用单独安装以上的loader

  • 我们仅需在 webpack.config.js的module属性中完成配置即可

const path = require("path");

module.exports = {
  entry: "./src/main.js",
  output: {
    filename: "bundle.js",
    path: path.resolve(__dirname, "./dist"),
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: ["style-loader", "css-loader", "postcss-loader"],
      },
      {
        test: /\.less$/,
        use: ["style-loader", "css-loader", "less-loader", "postcss-loader"],
      },
      //对图片资源进行打包设置
      {
        test: /\.(png|jpe?g|svg)/,
        type: "asset",
      },
    ],
  },
};

认识 asset module type

  • 在上面的配置中,我们设置了type:asset

  • type的类型有以下设置

    • **asset/resource:**发送一个单独的文件并导出URL
      • 之前通过file-loader实现
    • **asset/inline:**导出一个资源的data URI
      • 之前通过url-loader实现
    • **asset/source:**导出资源的源代码
      • 之前通过raw-loader实现
    • asset:在导出一个data URI和发送一个单独的文件之间自动选择
      • 之前通过url-loader,并且配置资源体积限制实现
  • asset/resource:使用该设置,会将图片打包成单独的单独的文件,放在dist文件夹中,通过url进行引入

    • 缺点就是,每一张图片都会进行一次网络请求,图片资源过多的时候,网络请求就会过多

image.png

  • **asset/inline:**使用该设置,会将图片设置成base64编码的格式,放在 bundle.js文件中
    • 缺点就是,当图片资源过大的时候,会增加bundle.js文件的体积,造成下载资源缓慢

image.png

  • asset:会根据图片资源的大小,去判断打包成新的文件,还是打包成base64编码格式
    • webpack.config.js中进行设置
const path = require("path");

module.exports = {
  entry: "./src/main.js",
  output: {
    filename: "bundle.js",
    path: path.resolve(__dirname, "./dist"),
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: ["style-loader", "css-loader", "postcss-loader"],
      },
      {
        test: /\.less$/,
        use: ["style-loader", "css-loader", "less-loader", "postcss-loader"],
      },
      //对图片资源进行打包设置
      {
        test: /\.(png|jpe?g|svg)/,
        type: "asset",
        //设置多大的图片会进行base64编码
        parser: {
          dataUrlCondition: {
            //单位是byte,60*1024代表60kb
            //60kb之前会生成base64编码
            //大于60kb会打包成单独的文件
            maxSize: 60 * 1024,
          },
        },
      },
    ],
  },
};

对打包资源图片进行重命名

  • webpack.config.js中进行设置
  • 通过 generator进行设置
const path = require("path");

module.exports = {
  entry: "./src/main.js",
  output: {
    filename: "bundle.js",
    path: path.resolve(__dirname, "./dist"),
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: ["style-loader", "css-loader", "postcss-loader"],
      },
      {
        test: /\.less$/,
        use: ["style-loader", "css-loader", "less-loader", "postcss-loader"],
      },
      //对图片资源进行打包设置
      {
        test: /\.(png|jpe?g|svg)/,
        type: "asset",
        //设置多大的图片会进行base64编码
        parser: {
          dataUrlCondition: {
            maxSize: 60 * 1024,
          },
        },
        generator: {
          //占位符
          //name:源文件名
          //ext:文件名的后缀.png  .jpg
          //hash:webpack生成的hash
          //前面可以加上路径,代表打包之后,放到哪个文件夹中
          filename: "img/[name]_[hash][ext]",
        },
      },
    ],
  },
};

image.png

Webpack对js代码的babel处理

我们知道,webpack默认会对js文件进行打包的,但是仅仅是将代码进行压缩以及丑化

并不能将ES5+的代码转换成ES5的代码,保持浏览器的兼容

因此这时候需要用到babel工具

Babel工具

  • Babel是一个 **工具链,**主要用于就浏览器或者环境中将 ES5+的代码转换成ES5的代码
  • postcss工具类似,可以单独使用,不用借助于Webpack
  • 此处主要学习Webpack中的babel设置
  • 在webpack中使用 npm install babel-loader安装Babel工具

Babel预设babel/preset-env

常见的预设有三个env react TypeScript

  • 与postcss-loader类似,我们可以单独安装插件进行单独的配置
  • 但是随着插件数量的增多,有了预设插件 npm install @babel/preset-env
  • 安装完成之后,创建 babel.config.js文件,在里面完成配置
module.exports = {
  presets: ["@babel/preset-env"],
};
  • webpack.config.js中的配置
const path = require("path");

module.exports = {
  entry: "./src/main.js",
  output: {
    filename: "bundle.js",
    path: path.resolve(__dirname, "./dist"),
  },
  module: {
    rules: [
      {
        //对js文件使用babel-loader工具
        test: /\.js/,
        //会自动去寻找babel.config.js中的设置
        use: ["babel-loader"],
      },
      {
        test: /\.css$/,
        use: ["style-loader", "css-loader", "postcss-loader"],
      },
      {
        test: /\.less$/,
        use: ["style-loader", "css-loader", "less-loader", "postcss-loader"],
      },
      //对图片资源进行打包设置
      {
        test: /\.(png|jpe?g|svg)/,
        type: "asset",
        parser: {
          dataUrlCondition: {
            maxSize: 60 * 1024,
          },
        },
        generator: {
          filename: "img/[name]_[hash][ext]",
        },
      },
    ],
  },
};

Webpack文件路径的解析和配置

  • 在我们实际发开中,会引入很多不同的依赖,通过 import/require的方式进行引入
  • 而webpack通过 enhanced-resolve模块对我们引入文件的路径进行一个解析
  • webpack能够解析三种文件路径
    • 绝对路径
      • 此种路径不会再做解析
    • 相对路径
    • 模块路径(require(“vue”))
      • 在resolve.modules中指定所有目录的检索模块
      • 默认值是[“node_modules”],所以默认会从 node_modules中查找相应的文件
  • 那么怎么区分是文件还是文件夹呢

import {name} from “./until”

import {name} from “./until.js”

  • 如果是一个文件:
    • 如果文件具有扩展名,则直接打包文件
    • 否则,将会使用resolve.extensions选项作为文件扩展名的解析
const path = require("path");

module.exports = {
  entry: "./src/main.js",
  output: {
    filename: "bundle.js",
    path: path.resolve(__dirname, "./dist"),
  },
   //对文件会自动进行添加后缀
   //即我们写出import {name} from "./until"这样的代码,会在until后面自动拼接extensions数组里面的内容
  resolve: {
      extensions: [".js", ".json", ".jsx", ".vue"],
      alias: {
          //最好使用绝对路径
          //现在 /untils就代表了.src/untils
          utils: path.resolve(__dirname, ".src/untils"),
      },
  },
  module: {
    rules: [
    ],
  },
};

  • 如果是一个文件夹
    • 会在文件夹中根据 resolve.mainFiles配置选项中指定的文件顺序查找
    • 默认值是 [index]
    • 再根据 resolve.extensions解析扩展名

Webpack常见的插件和模式

认识plugin

  • 很多人会吧 plugin插件Loader弄混
  • Loader是用于特定的模块类型进行转换:如对.css .vue .jsx等文件进行转换
  • plugin可以用于更加广泛的任务,比如打包的优化,资源的管理,环境变量的注入等等

CleanWebpackPlugin

当我们修改了代码,重新打包的时候,需要手动的清除dist,再重新打包才是最新的

我们可以借助 CleanWebpackPlugin插件,完成手动清除dist文件夹的操作

  • 首先,我们先安装此插件 npm install clean-webpack-plugin -D

  • 在 webpack.config.js文件中完成配置即可

const path = require("path");
//引入插件
const { CleanWebpackPlugin } = require("clean-webpack-plugin");

module.exports = {
  entry: "./src/main.js",
  output: {
    filename: "bundle.js",
    path: path.resolve(__dirname, "./dist"),
  },
    //使用插件
  plugins: [new CleanWebpackPlugin()],
  resolve: { },
  module: {
    rules: [],
  },
};

HtmlWebpackPlugin

在之前的学习中,当我们打包一个项目,生成的dist文件中并没有html文件,此插件的目的就是自动生成一个html文件

  • 首先通过 npm install html-webpack-plugin -D安装此插件
  • 之后再 webpack.config.js文件中使用此插件
    • 此插件可以传入 title(设置html标题)、template(设置使用html的模板)
const path = require("path");
//引入插件
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
  entry: "./src/main.js",
  output: {
    filename: "bundle.js",
    path: path.resolve(__dirname, "./dist"),
  },
    //使用插件
  plugins: [
      new CleanWebpackPlugin(),
  	  new HtmlWebpackPlugin({
      title: "zhangcheng",
      //自己引用模板的路径
      //   template: "相对路径",
    }),
  ],
  resolve: { },
  module: {
    rules: [],
  },
};

DefinePlugin的介绍

此插件已经集成到了 webpack中,因此我们直接引入即可

  • 此插件的目的是,在打包代码的过程中,生成全局变量
  • 此插件默认配置了 process.env.NODE_ENV用于区分开发环境和生成环境的
const path = require("path");
//引入插件
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const { DefinePlugin } = require("webpack");

module.exports = {
  entry: "./src/main.js",
  output: {
    filename: "bundle.js",
    path: path.resolve(__dirname, "./dist"),
  },
    //使用插件
  plugins: [
      new CleanWebpackPlugin(),
  	  new HtmlWebpackPlugin({
      title: "zhangcheng",
      //自己引用模板的路径
      //   template: "相对路径",
    }),
       new DefinePlugin({
      //使用key:value形式
      //value中会当成js代码
      counter: "1+1", //2
      counterStr: "'1+1'", //1+1字符串
    }),
  ],
  resolve: { },
  module: {
    rules: [],
  },
};

Mode配置

  • Mode配置选项,可以告知 webpack使用相应模式的内置优化
    • 默认值是 production(什么都不配置的情况下)
    • 可选值有:none|development|production

image.png

const path = require("path");


module.exports = {
    //Mode配置项
    mode:"development"
    entry: "./src/main.js",
    output: {
    filename: "bundle.js",
    path: path.resolve(__dirname, "./dist"),
},
    //使用插件
    plugins: [
        new CleanWebpackPlugin(),
        new HtmlWebpackPlugin({
            title: "zhangcheng",
            //自己引用模板的路径
            //   template: "相对路径",
        }),
        new DefinePlugin({
            //使用key:value形式
            //value中会当成js代码
            counter: "1+1", //2
            counterStr: "'1+1'", //1+1字符串
        }),
    ],
        resolve: { },
            module: {
                rules: [],
            },
};

Webpack搭建一个本地服务器

前面的学习中,我们编写完成代码后,需要手动执行build命令,完成项目的打包,效率会很低

  • 通过Webpack搭建一个本地的服务器,代码发生变化的时候,就自动打包,并刷新浏览器

  • 需要借助webpack-dev-server来完成以上操作

  • 首先通过 npm install webpack-dev-server -D安装 webpack-dev-server

  • 在package.json文件的scripts中增加相应的脚本

"scripts": {
    "build": "webpack",
    "serve": "webpack serve"
  },
  • 之后运行 npm run serve即可

  • 实际上webpack-dev-server会将代码打包到内存中,之后开启一个服务器,浏览器访问本地的服务器读取内存中的代码,并不会生成本地的文件

HMR模块热替换

  • 当我们只对某个模块发生了改变,则只会对改变的模块进行替换,添加以及删除等操作,从而无需刷新整个页面

  • HMR通过一下几种方式,来提高开发的效率

    • 不重新加载整个页面,这样可以保留某些应用程序的状态不丢失
    • 只更新需要变化的内容,节省开发的时间
    • 修改了css、js源代码,会立即在浏览器更新
  • 目前webpack是默认开启HMR的

    • 同时我们可以手动开启,在 webpack.config.js文件中,配置 devServer属性
    devServer:{
        hot:true
    }
    
  • 在代码中,我们需要指定哪些模块发生变化时,进行HMR

//判断是否开启了HMR
if(module.hot){
    module.hot.accept("./until.js",()=>{
        console.log("更新了")
    })
}

本地服务的配置

devServer:{
    hot:true,
    //修改端口号
    port:8888
    //修改主机
    host:"0.0.0.0"
    //自动打开浏览器
    open:true
    //是否对文件进行压缩
    compress:true
}

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

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

相关文章

前端Vue v-for 的使用

目录 ​编辑 简介 使用方式 基本使用 v-for"(item, index)中item和index作用 示例 迭代对象 示例 结果 前言-与正文无关 生活远不止眼前的苦劳与奔波,它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中,我们往往容易陷入…

【Linux】第三十八站:信号处理

文章目录 一、信号处理二、再谈进程地址空间三、内核如何实现信号的捕捉四、sigaction 一、信号处理 我们知道,信号保存以后,会在合适的时候进行处理这个信号。 那么信号是如何被处理的?什么时候进行处理呢? 当我们的进程从内核…

精通Python第13篇—数据之光:Pyecharts旭日图的魔法舞台

文章目录 引言准备工作绘制基本旭日图调整颜色和样式添加交互功能定制标签和标签格式嵌套层级数据高级样式与自定义进阶主题:动态旭日图数据源扩展:外部JSON文件总结 引言 数据可视化在现代编程中扮演着重要的角色,而Pyecharts是Python中一个…

【深度学习每日小知识】Bias 偏差

计算机视觉是人工智能的一个分支,它使机器能够解释和分析视觉信息。然而,与任何人造技术一样,计算机视觉系统很容易受到训练数据产生的偏差的影响。计算机视觉中的偏见可能会导致不公平和歧视性的结果,从而使社会不平等长期存在。…

Python进阶(1) | 使用VScode写单元测试

Python进阶(1) | 单元测试 2024.01.28 VSCode: 1.85.1 Linux(ubuntu 22.04) 文章目录 Python进阶(1) | 单元测试1. 目的2. Python Profile3. 单元测试框架3.1 什么是单元测试3.2 选一个单元测试框架3.3 编写 Python 单元测试代码3.4 在 VSCode 里发现单元测试3.5 再写一个单元…

问题:github上不了,但是其他网页可以正常打开

问题: github上不了,但是其他网页可以正常打开,试了关闭防火墙,dns刷新,都没用后,参考以下文章成功打开Github 1.Github无法访问解决方法 2.github访问不了?详细解决方法 解决办法&#xff1a…

用Python编写的简单双人对战五子棋游戏

本文是使用python创建的一个基于tkinter库的GUI界面,用于实现五子棋游戏。编辑器使用的是spyder,该工具。既方便做数据分析,又可以做小工具开发, 首先,导入tkinter库:import tkinter as tk,这…

leetcode刷题日志-146LRU缓存

思路:使用hashmap储存key,vaule,使用双向链表以快速查到尾结点(待逐出的节点),链表的题一定要在纸上画一下,不然连着连着就不知道连在哪里去了 class LRUCache {public class ListNode {int ke…

Java基础常见面试题总结(下)

常见的Exception有哪些? 常见的RuntimeException: ClassCastException //类型转换异常IndexOutOfBoundsException //数组越界异常NullPointerException //空指针ArrayStoreException //数组存储异常NumberFormatException //数字格式化异常ArithmeticE…

【Mac】windows PC用户转用Mac 配置笔记

win转mac使用的一些配置笔记;感觉mac在UI上还是略胜一筹,再配合在win上的操作习惯就体验更好了,对日常办公需求的本人足以。 优化设置 主要 操作优化 AltTab: win 习惯查看全部活动的alt键,对比cmdtab多了可以预览&…

前端——JavaScript

目录 文章目录 前言 一. JavaScript基础 1.JavaScript基本结构 2. JavaScript 执行过程 3. JavaScript 引入方式 二. JavaScript 语法 1.数据类型 2.变量 2.1 var 关键字定义变量 2.2 let 关键字定义变量 2.3 var 与 let 的区别 3.字符串 3.1定义字符串 3.2 字…

Px4学习:进入控制台的方法

运行命令 ls /dev/tty* 会列出所有端口 然后连接飞控通过USB数据线连接到电脑,再运行一次,就可以找到 笔者的是ttyACM0,下面会用到 px4源码 1.13.3 进入控制台 进入PX4源码文件夹,用终端打开,运行命令 ./Tools/mav…

Qt|大小端数据转换

后面打算写Qt关于网络编程的博客,网络编程就绕不开字节流数据传输,字节流数据的传输一般是根据协议来定义对应的报文该如何组包,那这就必然牵扯到了大端字节序和小端字节序的问题了。不清楚的大小端的可以看一下相关资料:大小端模…

jenkins对接K8S

创建连接K8S的凭据 查看需要使用到的命名空间 [rootk8s ~]# kubectl get ns |grep arts-system arts-system Active 16d创建service accounts [rootk8s ~]# kubectl create sa jenkins-k8s -n arts-system serviceaccount/jenkins-k8s created [rootk8s ~]# kubectl…

log4j2 配置入门介绍

配置 将日志请求插入到应用程序代码中需要进行大量的计划和工作。 观察表明,大约4%的代码专门用于日志记录。因此,即使是中等规模的应用程序也会在其代码中嵌入数千条日志记录语句。 考虑到它们的数量,必须管理这些日志语句,而…

CTF CRYPTO 密码学-7

题目名称:敲击 题目描述: 让我们回到最开始的地方 0110011001101100011000010110011101111011011000110110010100110011011001010011010100110000001100100110001100101101001101000011100001100011001110010010110100110100011001000011010100110000…

python简单socket demo

socket说明 socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。除了常见的http请求之外,一些敏感的数据传输常用socket套接字层直接传输数据。一个简单的domo用于熟…

构造器模式

构造器模式 意图 将一个复杂对象的构建和表示分离,使得相同的构建能创建不同的表示。 解释 案例:想象一个角色扮演游戏的特征生成器。最简单的选择是让计算机为你创建角色。如果你想手动选择特征的细节像职业、性别、头发的颜色等。特征的产生是一个循…

【golang】16、dlv 调试工具、vscode+ssh 远程调试

文章目录 Goland Debug 模式崩溃 Goland Debug 模式崩溃 有时遇到如下现象: Golang Run 模式正常,Debug 无 BreakPoint 模式正常,但 Debug 加 BreakPoint 就会偶现 panic,panic 信息如下。 panic: runtime error: index out of …

敲黑板啦!CSGO游戏搬砖项目操作注意事项

CSGO游戏搬砖项目怎么赚钱的,利润在哪? 1.两个平台之间币种不一样,就存在一个汇率差,两平台装备价格也不一样,汇率差-价格差利润。 CSGO游戏搬砖项目具体有哪些操作步骤? 1、准备一台电脑,配置…