webpack 基础应用 + 优化总结

news2024/11/19 5:41:06

文章目录

    • 概要
      • webpack 基础内容
      • vue3 打包优化总结
      • vue3 打包优化实例案例展示
    • HMR
    • 小结
      • webpack`配置文件实例
      • 应用优化总结

概要

webpack 基础内容

  1. 概念
    webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。

  2. 核心概念

    • 入口(entry):指定 webpack 从哪里开始构建依赖关系图。可以是一个或多个入口点,通常是 JavaScript 文件。例如在 webpack 配置中:
module.exports = {
    entry: './src/index.js'
};
- **输出(output)**:告诉 webpack 在哪里输出它所创建的 bundles,以及如何命名这些文件。
module.exports = {
    output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist')
    }
};
  • 加载器(loader):webpack 只能理解 JavaScript 和 JSON 文件。加载器用于将其他类型的文件(如 CSS、图片、字体等)转换为 webpack 能够处理的有效模块。例如,使用 css - loaderstyle - loader 来处理 CSS 文件:
module.exports = {
    module: {
        rules: [
            {
                test: /\.css$/,
                use: ['style-loader', 'css-loader']
            }
        ]
    }
};
  • 插件(plugin):用于执行范围更广的任务,比如打包优化、资源管理和注入环境变量等。例如,使用 HtmlWebpackPlugin 来自动生成 HTML 文件并引入打包后的 JavaScript 文件:
const HtmlWebpackPlugin = require('html - webpack - plugin');

module.exports = {
    plugins: [
        new HtmlWebpackPlugin({
            template: './src/index.html'
        })
    ]
};
  1. 模块(module)
    在 webpack 中,一切皆模块。一个模块可以是一个 JavaScript 文件、CSS 文件、图片文件等。每个模块都有自己的依赖关系,webpack 会根据这些依赖关系来构建整个应用的依赖图。

vue3 打包优化总结

  1. 优化目标
    减少打包后的文件体积、提高加载速度和运行性能。

  2. 优化方法

    • 代码分割(Code Splitting)
      • 使用动态导入(dynamic import),在 Vue 3 中,可以通过 import() 函数来实现。例如,对于一些只在特定条件下使用的组件,可以采用动态导入的方式,这样在初始加载时不会包含这些组件的代码。
// 异步加载组件
const AsyncComponent = () => import('./AsyncComponent.vue');
  • 利用 Vue 3 的异步组件 API,如 defineAsyncComponent,它可以更好地控制组件的加载和错误处理。
import { defineAsyncComponent } from 'vue';
const AsyncComponent = defineAsyncComponent(() => import('./AsyncComponent.vue'));
  • 优化依赖树
    - 尽量减少不必要的依赖安装。查看项目中使用的第三方库,删除那些没有实际使用的库。
    - 对于一些大型的第三方库,如果只使用了其中的部分功能,可以考虑使用更轻量级的替代方案或者进行针对性的引入(如果库支持的话)。
    • 压缩和优化输出
      • 使用 webpack 的生产模式(mode: 'production'),它会自动启用一些优化,如代码压缩。
      • 配置 optimization 选项,例如,可以设置 minimize: true 来确保代码被压缩,还可以配置 splitChunks 来进一步分割代码块,避免将所有代码打包到一个大的 bundle 中。
module.exports = {
    mode: 'production',
    optimization: {
        minimize: true,
        splitChunks: {
            chunks: 'all'
        }
    }
};
  • 图片和资源优化
    - 对于图片资源,可以使用合适的加载器来进行压缩。例如,使用 image - webpack - loader 可以在打包过程中对图片进行压缩。
    - 使用合适的格式,如对于一些小图标可以使用 SVG 格式,它在加载和渲染上有更好的性能。
    • 去除不必要的 Vue 特性
      如果项目中没有使用 Vue 的某些特性(如过渡效果、指令等),可以通过构建工具的配置或者 Vue 的自定义构建来去除这些不必要的代码,减少最终的打包体积。

vue3 打包优化实例案例展示

案例场景:假设我们有一个 Vue 3 项目,包含多个页面和组件,使用了一些第三方库,并且有较多的图片资源。

  1. 初始情况分析
    在初始构建后,发现打包后的文件体积较大,加载时间较长。经过分析,发现部分第三方库有很多未使用的功能,同时图片资源没有进行优化,而且一些组件的加载没有进行合理的分割。

  2. 优化步骤及效果

    • 代码分割
      • 对于一些只在特定页面使用的组件,采用了动态导入的方式。例如,有一个只在用户登录后才显示的设置页面组件,修改代码如下:
// 原代码
import SettingsComponent from './SettingsComponent.vue';

// 修改为
const SettingsComponent = () => import('./SettingsComponent.vue');
  • 经过此优化,初始加载的 bundle 体积明显减小,主页面的加载速度提高了约 30%。
    • 优化依赖树
      • 检查项目中的第三方库,发现 moment 库被完全引入,但实际上只使用了日期格式化功能。将其替换为 dayjs,这是一个更轻量级的日期处理库。同时,删除了一些没有使用的其他第三方库。
      • 这一步使得打包后的整体体积减少了约 20%。
    • 压缩和优化输出
      • 在 webpack 配置中,确保 mode 设置为 production,并进一步配置 optimization 选项:
module.exports = {
    mode: 'production',
    optimization: {
        minimize: true,
        splitChunks: {
            chunks: 'all',
            minSize: 20000,
            minRemainingSize: 0,
            minChunks: 1,
            maxAsyncRequests: 30,
            maxInitialRequests: 30,
            enforceSizeThreshold: 50000,
            cacheGroups: {
                defaultVendors: {
                    test: /[\\/]node_modules[\\/]/,
                    priority: -10
                },
                default: {
                    minChunks: 2,
                    priority: -20,
                    reuseExistingChunk: true
                }
            }
        }
    }
};
  • 通过这些优化,代码的压缩效果更好,进一步减少了 bundle 的大小,并且由于代码块的合理分割,加载时的资源并行加载效率提高。
    • 图片和资源优化
      • 安装并配置 image-webpack-loader,在 webpack 配置的 module 规则中添加对图片的处理:
module.exports = {
    module: {
        rules: [
            {
                test: /\.(png|jpg|jpeg|gif|svg)$/,
                use: [
                    {
                        loader: 'file-loader',
                        options: {
                            name: 'images/[name].[ext]'
                        }
                    },
                    {
                        loader: 'image-webpack-loader',
                        options: {
                            mozjpeg: {
                                progressive: true,
                                quality: 65
                            },
                            // 其他图片格式的优化选项
                        }
                    }
                ]
            }
        ]
    }
};
  • 将一些小图标从 PNG 格式转换为 SVG 格式。这些优化措施使得图片资源的加载时间减少了约 40%。
    • 去除不必要的 Vue 特性
      通过分析项目,发现没有使用 Vue 的过渡效果。在构建时,通过自定义 Vue 构建(使用 @vue/builder-utils 等相关工具)来去除过渡相关的代码,进一步减少了打包体积。经过一系列优化后,整个项目的加载速度和性能得到了显著提升,用户体验得到了改善。

HMR

  1. 什么是HMR(热模块替换)?

    • HMR(Hot Module Replacement)是一种技术,它允许在运行时更新模块,而无需进行完整的页面刷新。这对于开发过程中快速查看代码更改的效果非常有用,能够显著提高开发效率。例如,当你修改了一个CSS样式或者一个JavaScript函数时,通过HMR可以在浏览器中即时看到变化,而不需要重新加载整个页面,这样可以保留当前的应用状态。
  2. 在webpack中配置HMR的基本步骤

    • 安装必要的插件和依赖(如果需要)
      • 对于大多数基于webpack的项目,webpack-dev-server是实现HMR的关键。如果还没有安装,使用以下命令安装:
        npm install webpack-dev-server --save - dev
        
    • 配置webpack.config.js文件
      • 基础配置修改
        • webpack.config.jsdevServer选项中开启HMR。例如:
        const path = require('path');
        module.exports = {
          //...其他配置
          devServer: {
            contentBase: path.join(__dirname, 'dist'),
            hot: true,//开启HMR
            port: 9000
          },
          //...其他配置
        };
        
        • 这里contentBase指定了服务器从哪里提供内容,hot: true则是开启HMR的关键设置,port是服务器运行的端口号。
      • 模块热替换插件配置(如果是JavaScript模块)
        • 对于JavaScript模块,还需要在plugins部分添加webpack.HotModuleReplacementPlugin
        const webpack = require('webpack');
        const path = require('path');
        module.exports = {
          //...其他配置
          plugins: [
            new webpack.HotModuleReplacementPlugin()
          ],
          devServer: {
            contentBase: path.join(__dirname, 'dist'),
            hot: true,
            port: 9000
          },
          //...其他配置
        };
        
      • 处理CSS模块(以style - loader为例)
        • 当修改CSS文件时,为了让HMR能够正确处理CSS模块,在CSS加载器(style-loadercss-loader)的配置中需要添加特定的选项。
        module.exports = {
          //...其他配置
          module: {
            rules: [
              {
                test: /\.css$/,
                use: [
                  'style - loader',
                  {
                    loader: 'css-loader',
                    options: {
                      importLoaders: 1,
                      modules: false
                    }
                  }
                ]
              }
            ]
          },
          //...其他配置
        };
        
        • 对于style-loader,它本身就支持HMR。在css-loader的配置中,importLoaders指定了在@import的CSS文件中应用多少个加载器,modules设置为false表示不使用CSS模块(如果你的项目不需要的话)。
  3. 在代码中使用HMR(以JavaScript模块为例)

    • 当一个模块被更新时,你需要在模块中编写一些代码来处理更新。例如,在一个JavaScript模块中:
    if (module.hot) {
      module.hot.accept('./anotherModule.js', function() {
        // 当`./anotherModule.js`模块更新时,这里的代码会执行
        console.log('Another module has been updated.');
      });
    }
    
    • 这里module.hot.accept用于监听指定模块的更新。当./anotherModule.js模块被更新时,回调函数中的代码会被执行,你可以在这个回调函数中执行一些操作来更新应用的状态,比如重新渲染组件等。
  4. 注意事项

    • 兼容性问题
      • HMR并不是在所有浏览器和环境中都能完美工作。一些旧版本的浏览器可能不支持某些HMR功能。在实际开发中,需要考虑到目标浏览器的兼容性。
    • 状态管理的复杂性
      • 当使用HMR更新模块时,应用的状态管理可能会变得复杂。如果模块中有状态相关的代码(如Vuex或Redux中的状态),需要小心处理状态的更新和持久化,以避免出现意外的行为。例如,在更新一个包含状态管理的模块后,可能需要重新初始化或者合并状态,以确保应用的正常运行。

小结

webpack`配置文件实例

const path = require('path');

module.exports = {
  // 入口文件
  entry: './src/index.js',
  // 输出配置
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist')
  },
  // 模块处理规则
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env']
          }
        }
      }
    ]
  },
  // 开发服务器配置(用于开发环境)
  devServer: {
    contentBase: path.join(__dirname, 'dist'),
    port: 8080,
    hot: true
  },
  // 插件配置
  plugins: [
    new webpack.HotModuleReplacementPlugin()
  ]
};

应用优化总结

  1. 代码分割优化
    • 动态导入:对于大型项目,可以使用动态导入来分割代码。例如,如果有一些仅在特定用户操作或页面中才需要的模块,可以使用import()语法。假设在一个电商应用中,有一个复杂的订单管理模块,仅在用户进入订单页面时才需要加载。
const loadOrderModule = () => import('./orderModule.js');

这样,在初始加载时不会加载订单模块的代码,减小了初始包的大小。
- SplitChunks 插件:在webpack配置的optimization部分配置splitChunks。它可以自动将公共模块和第三方库提取到单独的文件中,避免重复打包。

optimization: {
  splitChunks: {
    chunks: 'all'
  }
}

例如,多个页面都使用了lodash库,通过splitChunkslodash会被提取到一个单独的文件中,多个页面可以共享这个文件,减少了总的打包体积。

  1. 优化加载器(Loader)
    • 缓存加载器结果:对于一些计算成本高的加载器(如babel - loader),可以启用缓存。在babel - loader的配置中添加cacheDirectory: true。这样,在重复构建时,如果模块没有变化,就可以直接使用缓存结果,加快构建速度。
{
  test: /\.js$/,
  exclude: /node_modules/,
  use: {
    loader: 'babel-loader',
    options: {
      presets: ['@babel/preset-env'],
      cacheDirectory: true
    }
  }
}
  • 优化图片加载器:如果项目中有大量图片,可以使用image - webpack - loader对图片进行压缩和优化。同时,根据图片的类型和使用场景选择合适的加载器和输出格式。例如,对于小图标可以使用url - loader将其转换为 base64 编码嵌入到 JavaScript 或 CSS 文件中,减少额外的网络请求。
{
  test: /\.(png|jpg|jpeg|gif)$/,
  use: [
    {
      loader: 'url-loader',
      options: {
        limit: 8192, // 小于8kb的图片转换为base64
        name: 'images/[name].[ext]'
      }
    },
    'image-webpack-loader'
  ]
}
  1. 优化插件(Plugin)使用
    • 压缩插件:在生产环境中,使用terse - webpack - plugin等压缩插件来压缩 JavaScript 代码。这可以显著减小打包后的文件大小,提高加载速度。
const TerserPlugin = require('terse-webpack-plugin');

module.exports = {
  //...其他配置
  optimization: {
    minimize: true,
    minimizer: [new TerserPlugin()]
  }
};
  • 去除无用代码:使用webpack - bundle - analyzer插件可以分析打包后的文件,查看哪些模块占用了大量空间,是否有未使用的代码。如果发现有未使用的第三方库或代码,可以将其移除或优化。例如,通过分析发现项目中引入了一个完整的 UI 库,但只使用了其中几个组件,那么可以考虑只引入需要的组件,减少打包体积。
  1. 优化开发环境和生产环境配置差异
    • 开发环境注重速度和调试便利性:在开发环境中,开启source - map可以方便调试。同时,可以使用eval - source - map模式,它在构建速度和调试便利性之间有较好的平衡。例如:
devtool: 'eval-source-map'
  • 生产环境注重性能和文件大小:在生产环境中,除了上述提到的压缩代码、优化图片等操作,还可以设置mode: 'production'webpack会自动启用一些优化,如代码压缩、去除调试信息等。同时,可以关闭一些不必要的开发相关的功能,如devServer等。
module.exports = {
  mode: 'production',
  //...其他生产环境特定配置
};
module.exports = {
  mode: 'development',
  //...其他开发环境特定配置
};

这样可以根据不同的环境需求,有针对性地优化webpack配置,提高开发效率和应用性能。

  1. 优化模块解析路径
    • 配置resolve选项:在webpack配置中,可以通过resolve选项来优化模块的解析路径。例如,可以设置alias来简化模块的引用路径。假设项目中有一个src目录,里面有很多子目录和模块,可以设置alias如下:
resolve: {
  alias: {
    '@': path.resolve(__dirname, 'src')
  }
}

这样,在代码中可以使用import something from '@/path/to/module'来代替相对复杂的import something from '../../../path/to/module',提高了代码的可读性和可维护性,同时在模块解析时也可能会更快。

{
  test: /\.js$/,
  include: [path.resolve(__dirname, 'src')], // 只处理src目录下的js文件
  use: {
    loader: 'babel-loader',
    options: {
      presets: ['@babel/preset-env']
    }
  }
}

同时,通过includeexclude选项更精确地指定loader处理的文件范围,避免不必要的文件处理,提高构建效率。

{
  test: /\.js$/,
  exclude: /node_modules/, // 不处理node_modules目录下的文件
  use: {
    loader: 'babel-loader',
    options: {
      presets: ['@babel/preset-env']
    }
  }
}
{
  test: /\.js$/,
  include: [path.resolve(__dirname, 'src')], // 只处理src目录下的js文件
  use: {
    loader: 'babel-loader',
    options: {
      presets: ['@babel/preset-env']
    }
  }
}

这样可以避免处理node_modules中的大量文件(通常这些文件已经是编译好的),同时只处理项目中自己编写的源代码,提高加载器的处理效率。

{
  test: /\.(js|jsx)$/,
  include: [path.resolve(__dirname, 'src')],
  use: [
    {
      loader: 'babel-loader',
      options: {
        presets: ['@babel/preset - env', '@babel/preset - react']
      }
    }
  ]
}

如果是 React 项目,还可以这样配置babel - loader来同时处理jsjsx文件,确保正确的代码转换和优化。

{
  test: /\.(js|jsx)$/,
  include: [path.resolve(__dirname, 'src')],
  use: [
    {
      loader: 'babel-loader',
      options: {
        presets: ['@babel/preset - env', '@babel/preset - react'],
        plugins: ['react - hot - loader/babel']
      }
    }
  ]
}

并且可以添加react - hot - loader/babel插件来实现 React 组件的热更新,提高开发效率。

{
  test: /\.(scss|sass)$/,
  use: [
    'style - loader',
    'css - loader',
   'sass - loader'
  ]
}

对于样式文件(如scsssass),合理配置加载器,确保样式的正确处理和应用,同时可以考虑添加postcss - loader来添加一些样式的后处理功能,如自动添加浏览器前缀等。

{
  test: /\.(scss|sass)$/,
  use: [
    'style - loader',
    'css - loader',
  'sass - loader',
    'postcss - loader'
  ]
}
{
  test: /\.(css)$/,
  use: [
    'style - loader',
    'css - loader',
    'postcss - loader'
  ]
}

对于普通css文件也可以添加postcss - loader,通过配置postcss.config.js文件来定义具体的后处理规则。

module.exports = {
  plugins: [
    require('autoprefixer')
  ]
};

例如,在postcss.config.js中添加autoprefixer来自动为css样式添加浏览器前缀,提高样式的兼容性。

{
  test: /\.(woff|woff2|eot|ttf|otf)$/,
  use: [
    'file - loader'
  ]
}

对于字体文件,使用file - loader进行处理,确保字体在项目中的正确加载和应用。

{
  test: /\.(svg)$/,
  use: [
    'file - loader'
  ]
}

对于svg文件,同样可以使用file - loader,或者根据具体情况使用svg - inline - loader等其他专门处理svg的加载器,比如如果要将svg内联到htmljs文件中,可以使用svg - inline - loader

{
  test: /\.(html)$/,
  use: [
    'html - loader'
  ]
}

对于html文件,如果需要在webpack中进行处理(如在js中导入html模板),可以使用html - loader

{
  test: /\.(html)$/,
  use: [
    {
      loader: 'html - loader',
      options: {
        minimize: true
      }
    }
  ]
}

并且可以添加minimize选项来对html文件进行压缩,减少文件大小,提高加载速度。

{
  test: /\.(pug)$/,
  use: [
    'pug - loader'
  ]
}

如果项目中使用pug模板,可以使用pug - loader进行处理,将pug模板转换为html

{
  test: /\.(jade)$/,
  use: [
    'jade - loader'
  ]
}

对于jade模板(pug的旧称),使用jade - loader进行处理,确保模板的正确转换和应用。

{
  test: /\.(xml)$/,
  use: [
    'xml - loader'
  ]
}

如果项目中有xml文件需要处理,可以使用xml - loader

{
  test: /\.(json)$/,
  use: [
    'json - loader'
  ]
}

对于json文件,可以使用json - loader,不过在webpack 4及以上版本,json文件默认可以被处理,无需额外配置json - loader

{
  test: /\.(yaml|yml)$/,
  use: [
    'yaml - loader'
  ]
}

如果项目中使用yamlyml文件,可以使用yaml - loader进行处理。

{
  test: /\.(md)$/,
  use: [
    'markdown - loader'
  ]
}

对于markdown文件,如果需要在项目中处理(如将markdown文件渲染为html),可以使用markdown - loader

{
  test: /\.(txt)$/,
  use: [
    'raw - loader'
  ]
}

对于txt文件,可以使用raw - loader将其内容作为字符串加载到js文件中。

{
  test: /\.(csv)$/,
  use: [
    'csv - loader'
  ]
}

如果项目中有csv文件需要处理,可以使用csv - loader

{
  test: /\.(ts|tsx)$/,
  include: [path.resolve(__dirname, 'src')],
  use: [
    'ts - loader'
  ]
}

对于TypeScript项目,使用ts - loader来处理tstsx文件,确保TypeScript代码的正确编译和优化。

{
  test: /\.(ts|tsx)$/,
  include: [path.resolve(__dirname, 'src')],
  use: [
    {
      loader: 'ts - loader',
      options: {
        transpileOnly: true
      }
    }
  ]
}

并且可以添加transpileOnly选项,它可以加快ts - loader的处理速度,不过需要注意的是,这种模式下不会进行类型检查,所以可以在项目中另外配置tsc进行类型检查。

{
  test: /\.(glsl|vert|frag)$/,
  use: [
    'webpack - glsl - loader'
  ]
}

如果项目涉及到WebGL相关的glslvertfrag等文件,可以使用webpack - glsl - loader进行处理。

{
  test: /\.(wav|mp3|midi|ogg)$/,
  use: [
    'file - loader'
  ]
}

对于音频文件,可以使用file - loader进行处理,确保音频文件在项目中的正确加载和应用。

{
  test: /\.(mp4|webm|ogg)$/,
  use: [
    'file - loader'
  ]
}

对于视频文件,同样可以使用file - loader进行处理。

{
  test: /\.(webp)$/,
  use: [
    'file - loader'
  ]
}

对于webp格式的图像文件,使用file - loader进行处理。

{
  test: /\.(ico)$/,
  use: [
    'file - loader'
  ]
}

对于ico图标文件,使用file - loader进行处理。

{
  test: /\.(swf)$/,
  use: [
    'file - loader'
  ]
}

对于swf文件,可以使用file - loader进行处理。

{
  test: /\.(map)$/,
  use: [
    'file - loader'
  ]
}

对于map文件(如source - map文件),可以使用file - loader进行处理,不过需要注意根据具体情况决定是否需要在生产环境中包含这些文件,通常在生产环境中可以不包含source - map文件以减小文件大小。

{
  test: /\.(dat)$/,
  use: [
    'file - loader'
  ]
}

对于dat文件等其他特殊类型的文件,如果需要在项目中处理,可以根据文件的性质选择合适的加载器或自行编写加载器。

{
  test: /\.(node)$/,
  use: [
    'node - loader'
  ]
}

对于node模块文件(如果需要在webpack构建的前端项目中使用),可以使用node - loader进行处理,不过需要谨慎使用,因为node模块可能会引入一些与前端环境不兼容的代码。

{
  test: /\.(asar)$/,
  use: [
    'asar - loader'
  ]
}

如果项目涉及到asar文件(如在Electron应用中),可以使用asar - loader进行处理。

{
  test: /\.(asar.unpacked)$/,
  use: [
    'asar - unpacked - loader'
  ]
}

对于asar.unpacked文件(同样在Electron应用相关场景

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

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

相关文章

逆向攻防世界CTF系列41-EASYHOOK

逆向攻防世界CTF系列41-EASYHOOK 看题目是一个Hook类型的,第一次接触,虽然学过相关理论,可以看我的文章 Hook入门(逆向)-CSDN博客 题解参考:https://www.cnblogs.com/c10udlnk/p/14214057.html和攻防世界逆向高手题之EASYHOOK-…

【网络】HTTP 协议

目录 基本概念基于 HTTP 的系统组成HTTP 的基本性质 HTTP 请求头 & 响应头HTTP 的请求方法HTTP 的返回码HTTP 的 CookieHTTP 缓存 Cache-Control会话HTTP/1.x 的连接管理 基本概念 HTTP(Hypertext Transfer Protocol,超文本传输协议)是一…

执行flink sql连接clickhouse库

手把手教学,flink connector打通clickhouse大数据库,通过下发flink sql,来使用ck。 组件版本jdk1.8flink1.17.2clickhouse23.12.2.59 1.背景 flink官方不支持clickhouse连接器,工作中难免会用到。 2.方案 利用GitHub大佬提供…

笔记|M芯片MAC (arm64) docker上使用 export / import / commit 构建amd64镜像

很简单的起因,我的东西最终需要跑在amd64上,但是因为mac的架构师arm64,所以直接构建好的代码是没办法跨平台运行的。直接在arm64上pull下来的docker镜像也都是arm64架构。 检查镜像架构: docker inspect 8135f475e221 | grep Arc…

免费送源码:Java+Springboot+MySQL Springboot多租户博客网站的设计 计算机毕业设计原创定制

Springboot多租户博客网站的设计 摘 要 博客网站是当今网络的热点,博客技术的出现使得每个人可以零成本、零维护地创建自己的网络媒体,Blog站点所形成的网状结构促成了不同于以往社区的Blog文化,Blog技术缔造了“博客”文化。本文课题研究的“…

代码随想录第46期 单调栈

这道题主要是单调栈的简单应用 class Solution { public:vector<int> dailyTemperatures(vector<int>& T) {vector<int> result(T.size(),0);stack<int> st;st.push(0);for(int i1;i<T.size();i){if(T[i]<T[st.top()]){st.push(i);}else{wh…

【Three.js基础学习】24. shader patterns

前言 课程回顾: ShaderMaterial 这里用的是着色器材质 所以顶点和片段着色器就不需要像原始着色器那样添加需要的属性 然后写 片段着色器需要属性 &#xff1a; 顶点 属性 -》变化 -》 片段中 顶点中的属性不需要声明 只需要声明传送的变量 例如 varying vec vUv; vUv uv; 补充…

力扣整理版七:二叉树(待更新)

满二叉树&#xff1a;如果一棵二叉树只有度为0的结点和度为2的结点&#xff0c;并且度为0的结点在同一层上&#xff0c;则这棵二叉树为满二叉树。深度为k&#xff0c;有2^k-1个节点的二叉树。 完全二叉树&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&am…

173. 二叉搜索树迭代器【 力扣(LeetCode) 】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 173. 二叉搜索树迭代器 一、题目描述 实现一个二叉搜索树迭代器类BSTIterator &#xff0c;表示一个按中序遍历二叉搜索树&#xff08;BST&#xff09;的迭代器&#xff1a; BSTIterato…

自动驾驶系列—深入解析自动驾驶车联网技术及其应用场景

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

STL序列式容器之list

相较于vector的连续性空间&#xff0c;list相对比较复杂&#xff1b;list内部使用了双向环形链表的方式对数据进行存储&#xff1b;list在增加元素时&#xff0c;采用了精准的方式分配一片空间对数据及附加指针等信息进行存储&#xff1b; list节点定义如下 template<clas…

Element-ui Select选择器自定义搜索方法

效果图 具体实现 <template><div class"home"><el-selectref"currencySelect"v-model"currency"filterable:spellcheck"false"placeholder"请选择":filter-method"handleCurrencyFilter"change&q…

Linux debian系统安装ClamTk开源图形用户界面(GUI)杀毒软件

一、ClamTk简介 ClamTk 是一个基于 ClamAV 的开源图形用户界面&#xff08;GUI&#xff09;杀毒软件。它使用 GTK2-Perl 脚本构建而成&#xff0c;支持32位与64位操作系统。ClamTk 提供了一个直观的用户界面&#xff0c;使得用户无需深入了解命令行即可完成大部分操作。它具备…

MIT6.5840 Lab 1: MapReduce(6.824)

结果 介绍 在本实验中&#xff0c;您将构建一个MapReduce系统。您将实现一个调用应用程序Map和Reduce函数并处理文件读写的工作进程&#xff0c;以及一个将任务分发给工作进程并处理失败的工作进程的协调进程。您将构建类似于MapReduce论文的东西。&#xff08;注意&#xff1a…

Kafka进阶_1.生产消息

文章目录 一、Controller选举二、生产消息2.1、创建待发送数据2.2、创建生产者对象&#xff0c;发送数据2.3、发送回调2.3.1、异步发送2.3.2、同步发送 2.4、拦截器2.5、序列化器2.6、分区器2.7、消息可靠性2.7.1、acks 02.7.2、acks 1(默认)2.7.3、acks -1或all 2.8、部分重…

SpringBoot多环境配置的实现

前言 开发过程中必然使用到的多环境案例&#xff0c;通过简单的案例分析多环境配置的实现过程。 一、案例 1.1主配置文件 spring:profiles:active: prod server:port: 80801.2多环境配置文件 开发环境 blog:domain: http://localhost:8080测试环境 blog:domain: https:/…

鸿蒙HarmonyOS 地图定位到当前位置 site查询等操作

应用服务Map使用 地图定位 地点查询及导航 周边查询 点位标记定义等 地图定位 前提地图已经能正常显示&#xff0c;若不能显示请大家参考之前的那篇如何显示地图的博文 地图相关的api 位置效果图&#xff1a; module.json5配置权限 "requestPermissions": [{&…

AntFlow 0.11.0版发布,增加springboot starter模块,一款设计上借鉴钉钉工作流的免费企业级审批流平台

AntFlow 0.11.0版发布,增加springboot starter模块,一款设计上借鉴钉钉工作流的免费企业级审批流平台 传统老牌工作流引擎比如activiti,flowable或者camunda等虽然功能强大&#xff0c;也被企业广泛采用&#xff0c;然后也存着在诸如学习曲线陡峭&#xff0c;上手难度大&#x…

Timeline动画「硬切」的问题

1&#xff09;Timeline动画「硬切」的问题 2&#xff09;移动平台纹理压缩格式选择ASTC&#xff0c;美术出图还需遵守POT吗 3&#xff09;如何去掉DOTS Unity.Entities.Graphics创建的BatchRendererGroup的UI相机回调 4&#xff09;Timeline播放动画会产生位移的问题 这是第409…

《设计模式》创建型模式总结

目录 创建型模式概述 Factory Method: 唯一的类创建型模式 Abstract Factory Builder模式 Prototype模式 Singleton模式 最近在参与一个量化交易系统的项目&#xff0c;里面涉及到用java来重构部分vnpy的开源框架&#xff0c;因为是框架的搭建&#xff0c;所以会涉及到像…