vue2打包优化-小白也可快速上手的一套

news2025/1/23 12:42:03

需求:项目过大可以使用打包优化,减少项目体积,加速页面加载,增强用户体验,跟着步骤来即可实现,主要是vue2的打包优化,不是vue3,文章可能有点长,但是很实用哈哈,耐心看完~

1.打包前体积

运行如下命令开始打包,注意!!!打包之前必须保证项目有node_modules依赖包,不然提示命令无效,npm run build后默认的环境为production

npm run build

优化前打包体积 2.14M

2.下载打包体积可视化工具

npm i webpack-bundle-analyzer

再vue.config.js文件中配置,如果没有这个文件,自己在主目录新建个就行,配置如下:

// 导入包分析器插件
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
const ENV = process.env.NODE_ENV
module.exports = {
    configureWebpack: config => {
        // 如果是在线上环境
        if (ENV === 'production') {
            config.plugins.push(
                // 解决端口被占用的问题
                new BundleAnalyzerPlugin({
                    analyzerMode: 'server',
                    analyzerHost: '127.0.0.1',//ip地址
                    analyzerPort: 8880,//设置个未使用的端口就行,默认端口为8888
                    reportFilename: 'report.html',
                    defaultSizes: 'parsed',
                    openAnalyzer: true,
                    generateStatsFile: false,
                    statsFilename: 'stats.json',
                    statsOptions: null,
                    logLevel: 'info'
                }),
            )


        }
    }
}

配置完成后删除dist文件再重新打包,会自动弹出网页,这里我们可以看到打包后的体积为2.43MB

3.使用Gzip压缩js和css

安装插件,注意!!!一定不要安装最新版,直接安装6.1.1的版本就行

npm i compression-webpack-plugin@6.1.1

安装最新版会报如下错误

再vue.config.js中添加

// 导入包分析器插件
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
// 导入gzip
const CompressionWebpackPlugin = require('compression-webpack-plugin')
const ENV = process.env.NODE_ENV
module.exports = {
    configureWebpack: config => {
        // 如果是在线上环境
        if (ENV === 'production') {
            config.plugins.push(
                // 解决端口被占用的问题
                new BundleAnalyzerPlugin({
                    analyzerMode: 'server',
                    analyzerHost: '127.0.0.1',//ip地址
                    analyzerPort: 8880,//设置个未使用的端口就行,默认端口为8888
                    reportFilename: 'report.html',
                    defaultSizes: 'parsed',
                    openAnalyzer: true,
                    generateStatsFile: false,
                    statsFilename: 'stats.json',
                    statsOptions: null,
                    logLevel: 'info'
                }),
                // gzip,压缩js
                new CompressionWebpackPlugin({
                    filename: '[path].gz[query]',//压缩文件的输入路径和名称
                    algorithm: "gzip",//表示使用gzip算法进行压缩
                    test: new RegExp('\\.(' + ['js', 'css'].join('|') + ')$'),//正则匹配文件名
                    threshold: 10240,//文件大小阀值,大于或者等于10240字节(10kb)
                    minRatio: 0.8,//最小压缩比例,只有压缩后大小与原始大小的比例大于等于该值时,才会保留压缩后的文件。这里设置为 0.8,表示压缩后的文件大小至少为原始文件大小的 80%。
                    deleteOriginalAssets: false,//保留原始文件
                })
            )


        }
    }
}

 4.添加基础配置和删除需要预先加载和预先获取的资源

主要代码:

    chainWebpack: (config) => {
        // 删除需要预先加载(当前页面)的资源,当需要这些资源的时候,页面会自动加载
        config.plugins.delete('preload')
        // 删除需要预先获取(将来的页面)的资源
        config.plugins.delete('prefetch')
    }
// 导入包分析器插件
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
// 导入gzip
const CompressionWebpackPlugin = require('compression-webpack-plugin')
const ENV = process.env.NODE_ENV
module.exports = {
    outputDir: 'dist',
    // 放置生成的静态资源 (js、css、img、fonts) 的 (相对于 outputDir 的) 目录
    assetsDir: 'static',
    // lintOnSave: process.env.NODE_ENV === 'development',
    lintOnSave: false,//关闭eslint检查
    // 不输出 map 文件,false将提高构建速度
    productionSourceMap: false,
    configureWebpack: config => {
        // 如果是在线上环境
        if (ENV === 'production') {
            config.plugins.push(
                // 解决端口被占用的问题
                new BundleAnalyzerPlugin({
                    analyzerMode: 'server',
                    analyzerHost: '127.0.0.1',//ip地址
                    analyzerPort: 8880,//设置个未使用的端口就行,默认端口为8888
                    reportFilename: 'report.html',
                    defaultSizes: 'parsed',
                    openAnalyzer: true,//浏览器自动打开
                    generateStatsFile: false,
                    statsFilename: 'stats.json',
                    statsOptions: null,
                    logLevel: 'info'
                }),
                // gzip,压缩js
                new CompressionWebpackPlugin({
                    filename: '[path].gz[query]',//压缩文件的输入路径和名称
                    algorithm: "gzip",//表示使用gzip算法进行压缩
                    test: new RegExp('\\.(' + ['js', 'css'].join('|') + ')$'),//正则匹配文件名
                    threshold: 10240,//文件大小阀值,大于或者等于10240字节(10kb)
                    minRatio: 0.8,//最小压缩比例,只有压缩后大小与原始大小的比例大于等于该值时,才会保留压缩后的文件。这里设置为 0.8,表示压缩后的文件大小至少为原始文件大小的 80%。
                    deleteOriginalAssets: false,//保留原始文件
                })
            )


        }
    },
    chainWebpack: (config) => {
        // 删除需要预先加载(当前页面)的资源,当需要这些资源的时候,页面会自动加载
        config.plugins.delete('preload')
        // 删除需要预先获取(将来的页面)的资源
        config.plugins.delete('prefetch')
    }
}

原先文件目录结构==============修改基础配置后的打包文件结构

5.使用webpack合并js,并且可以对代码进行优化压缩

主要代码

`vue.config.js: `

const webpack = require('webpack')
const ENV = process.env.NODE_ENV

module.exports = {
  chainWebpack: (config) => {
    config.when(ENV === 'production', config => {
      config.plugin('webpackOptimize')
      .use(
        webpack.optimize.LimitChunkCountPlugin, 
        // 限制生成的代码块(chunks)的数量
        [{ maxChunks: 10 }]
      )
      .use(
        webpack.optimize.MinChunkSizePlugin, 
        // 指定代码块的最小字节数
        [{ minChunkSize: 50000 }]
      )
    })
  }
}

完整代码

const webpack = require('webpack')
// 导入包分析器插件
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
// 导入gzip
const CompressionWebpackPlugin = require('compression-webpack-plugin')
const ENV = process.env.NODE_ENV
module.exports = {
    outputDir: 'dist',
    // 放置生成的静态资源 (js、css、img、fonts) 的 (相对于 outputDir 的) 目录
    assetsDir: 'static',
    // lintOnSave: process.env.NODE_ENV === 'development',
    lintOnSave: false,//关闭eslint检查
    // 不输出 map 文件,false将提高构建速度
    productionSourceMap: false,
    configureWebpack: config => {
        // 如果是在线上环境
        if (ENV === 'production') {
            config.plugins.push(
                // 解决端口被占用的问题
                new BundleAnalyzerPlugin({
                    analyzerMode: 'server',
                    analyzerHost: '127.0.0.1',//ip地址
                    analyzerPort: 8880,//设置个未使用的端口就行,默认端口为8888
                    reportFilename: 'report.html',
                    defaultSizes: 'parsed',
                    openAnalyzer: true,//浏览器自动打开
                    generateStatsFile: false,
                    statsFilename: 'stats.json',
                    statsOptions: null,
                    logLevel: 'info'
                }),
                // gzip,压缩js
                new CompressionWebpackPlugin({
                    filename: '[path].gz[query]',//压缩文件的输入路径和名称
                    algorithm: "gzip",//表示使用gzip算法进行压缩
                    test: new RegExp('\\.(' + ['js', 'css'].join('|') + ')$'),//正则匹配文件名
                    threshold: 10240,//文件大小阀值,大于或者等于10240字节(10kb)
                    minRatio: 0.8,//最小压缩比例,只有压缩后大小与原始大小的比例大于等于该值时,才会保留压缩后的文件。这里设置为 0.8,表示压缩后的文件大小至少为原始文件大小的 80%。
                    deleteOriginalAssets: false,//保留原始文件
                })
            )


        }
    },
    chainWebpack: (config) => {
        // 删除需要预先加载(当前页面)的资源,当需要这些资源的时候,页面会自动加载
        config.plugins.delete('preload')
        // 删除需要预先获取(将来的页面)的资源
        config.plugins.delete('prefetch')
        config.when(ENV === 'production', config => {
            config.plugin('webpackOptimize')
                .use(
                    webpack.optimize.LimitChunkCountPlugin,
                    // 限制生成的代码块(chunks)的数量
                    [{ maxChunks: 10 }]
                )
                .use(
                    webpack.optimize.MinChunkSizePlugin,
                    // 指定代码块的最小字节数
                    [{ minChunkSize: 50000 }]
                )
        })
    }
}

大小查看,减小了一点点哈哈

6.使用cdn加速,可以把一些大包在线上使用cdn加速的方式实现

6.1在主目录建立dependencies-cdn.js

6.2添加需要cdn的加速插件

在这里我用的是BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务有需要的直接去里面搜之后把你自己下载好的插件版本对应上就行,比如我在项目的vuex:3.6.2,那么我去里面找对应版本之后把min.js文件复制进去就行,css是这个插件需要俩个一起导入才行,比如element有一个样式和一个功能。

// cnd加速

module.exports = [
  { name: 'vue', library: 'Vue', js: 'https://cdn.bootcdn.net/ajax/libs/vue/2.6.14/vue.min.js', css: '' },
  { name: 'vue-router', library: 'VueRouter', js: 'https://cdn.bootcdn.net/ajax/libs/vue-router/3.5.1/vue-router.min.js', css: '' },
  { name: 'vuex', library: 'Vuex', js: 'https://cdn.bootcdn.net/ajax/libs/vuex/3.6.2/vuex.min.js', css: '' },
  { name: 'axios', library: 'axios', js: 'https://cdn.bootcdn.net/ajax/libs/axios/1.1.3/axios.min.js', css: '' },
  { name: 'element-ui', library: 'ELEMENT', js: 'https://unpkg.com/element-ui/lib/index.js', css: 'https://unpkg.com/element-ui/lib/theme-chalk/index.css' },
]

6.3在vue.config.js中导入

主要代码:

const cdnDependencies = require('./dependencies-cdn')
// 设置不参与构建的库
let externals = {}
cdnDependencies.forEach(package => { externals[package.name] = package.library })
// 引入文件的 cdn 链接
const cdn = {
  css: cdnDependencies.map(e => e.css).filter(e => e),
  js: cdnDependencies.map(e => e.js).filter(e => e)
}
module.exports = {
  configureWebpack: config => {
        // 如果是在线上环境
        if (ENV === 'production') {
             config.externals = externals}},
   chainWebpack: (config) => {
        /**
   * 添加 CDN 参数到 htmlWebpackPlugin 配置中
   */
        config.plugin('html').tap(args => {
            if (process.env.NODE_ENV === 'production') {
                args[0].cdn = cdn
            } else {
                args[0].cdn = []
            }
            return args
        })
    }
}
}

完整代码

const webpack = require('webpack')
// 导入包分析器插件
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
// 导入gzip
const CompressionWebpackPlugin = require('compression-webpack-plugin');
// 导入cdn
const cdnDependencies = require('./dependencies-cdn')
// 设置不参与构建的库
let externals = {}
cdnDependencies.forEach(package => { externals[package.name] = package.library })
// 引入文件的 cdn 链接
const cdn = {
    css: cdnDependencies.map(e => e.css).filter(e => e),
    js: cdnDependencies.map(e => e.js).filter(e => e)
}

const ENV = process.env.NODE_ENV
module.exports = {
    // 例如 https://www.ciqin.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ciqin.vip/admin/,则设置 baseUrl 为 /admin/。
    publicPath: process.env.NODE_ENV === "production" ? "/" : "/",
    outputDir: 'dist',
    // 放置生成的静态资源 (js、css、img、fonts) 的 (相对于 outputDir 的) 目录
    assetsDir: 'static',
    // lintOnSave: process.env.NODE_ENV === 'development',
    lintOnSave: false,//关闭eslint检查
    // 不输出 map 文件,false将提高构建速度
    productionSourceMap: false,
    configureWebpack: config => {
        // 如果是在线上环境
        if (ENV === 'production') {
            config.externals = externals
            config.plugins.push(

                // 解决端口被占用的问题
                new BundleAnalyzerPlugin({
                    analyzerMode: 'server',
                    analyzerHost: '127.0.0.1',//ip地址
                    analyzerPort: 8880,//设置个未使用的端口就行,默认端口为8888
                    reportFilename: 'report.html',
                    defaultSizes: 'parsed',
                    openAnalyzer: true,//浏览器自动打开
                    generateStatsFile: false,
                    statsFilename: 'stats.json',
                    statsOptions: null,
                    logLevel: 'info'
                }),
                // gzip,压缩js
                new CompressionWebpackPlugin({
                    filename: '[path].gz[query]',//压缩文件的输入路径和名称
                    algorithm: "gzip",//表示使用gzip算法进行压缩
                    test: /\.(js|css|html)?$/i,//正则匹配文件名
                    threshold: 10240,//文件大小阀值,大于或者等于10240字节(10kb)
                    minRatio: 0.8,//最小压缩比例,只有压缩后大小与原始大小的比例大于等于该值时,才会保留压缩后的文件。这里设置为 0.8,表示压缩后的文件大小至少为原始文件大小的 80%。
                    deleteOriginalAssets: false,//保留原始文件
                    cache: false// 不启用文件缓存
                })
            )


        }
    },
    chainWebpack: (config) => {
        // 删除需要预先加载(当前页面)的资源,当需要这些资源的时候,页面会自动加载
        config.plugins.delete('preload')
        // 删除需要预先获取(将来的页面)的资源
        config.plugins.delete('prefetch')
        config.when(ENV === 'production', config => {
            config.plugin('webpackOptimize')
                .use(
                    webpack.optimize.LimitChunkCountPlugin,
                    // 限制生成的代码块(chunks)的数量
                    [{ maxChunks: 10 }]
                )
                .use(
                    webpack.optimize.MinChunkSizePlugin,
                    // 指定代码块的最小字节数
                    [{ minChunkSize: 50000 }]
                )
        })
        /**
   * 添加 CDN 参数到 htmlWebpackPlugin 配置中
   */
        config.plugin('html').tap(args => {
            if (process.env.NODE_ENV === 'production') {
                args[0].cdn = cdn
            } else {
                args[0].cdn = []
            }
            return args
        })
    }
}

6.4在public下的index.html中设置

<!DOCTYPE html>
<html lang="">
  <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" />
    <link rel="icon" href="<%= BASE_URL %>favicon.ico" />
    <!-- 使用 CDN 加速的 CSS 文件,配置在 vue.config.js 下 -->
    <% for (var i in
    htmlWebpackPlugin.options.cdn&&htmlWebpackPlugin.options.cdn.css) { %>
    <link
      href="<%= htmlWebpackPlugin.options.cdn.css[i] %>"
      rel="preload"
      as="style"
    />
    <link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="stylesheet" />
    <% } %>
    <title><%= htmlWebpackPlugin.options.title %></title>
  </head>
  <body>
    <noscript>
      <strong
        >We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work
        properly without JavaScript enabled. Please enable it to
        continue.</strong
      >
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
    <!-- 使用 CDN 加速的 JS 文件,配置在 vue.config.js 下 -->
    <% for (var i in htmlWebpackPlugin.options.cdn &&
    htmlWebpackPlugin.options.cdn.js) { %>
    <script src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script>
    <% } %>
  </body>
</html>

6.4打包后体积1.51MB,减小了快一半了,当然你写的cdn越多减的体积也越多

 7.使用happypack提高打包速度

7.1下载happypack

npm install happypack -D

7.2再vue.config.js中导入

主要代码

// 导入多线程
const HappyPack = require('happypack');
const os = require('os');
// 开辟一个线程池,拿到系统CPU的核数,happypack 将编译工作利用所有线程
const happyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length });
   new HappyPack({
                    id: 'happybabel',
                    loaders: ['babel-loader'],
                    threadPool: happyThreadPool
                })
            )

完整代码

const webpack = require('webpack')
// 导入包分析器插件
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
// 导入gzip
const CompressionWebpackPlugin = require('compression-webpack-plugin');
// 导入cdn
const cdnDependencies = require('./dependencies-cdn')
// 导入多线程
const HappyPack = require('happypack');
const os = require('os');
// 开辟一个线程池,拿到系统CPU的核数,happypack 将编译工作利用所有线程
const happyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length });
// 设置不参与构建的库
let externals = {}
cdnDependencies.forEach(package => { externals[package.name] = package.library })
// 引入文件的 cdn 链接
const cdn = {
    css: cdnDependencies.map(e => e.css).filter(e => e),
    js: cdnDependencies.map(e => e.js).filter(e => e)
}

const ENV = process.env.NODE_ENV
module.exports = {
    // 例如 https://www.ciqin.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ciqin.vip/admin/,则设置 baseUrl 为 /admin/。
    publicPath: process.env.NODE_ENV === "production" ? "/" : "/",
    outputDir: 'dist',
    // 放置生成的静态资源 (js、css、img、fonts) 的 (相对于 outputDir 的) 目录
    assetsDir: 'static',
    // lintOnSave: process.env.NODE_ENV === 'development',
    lintOnSave: false,//关闭eslint检查
    // 不输出 map 文件,false将提高构建速度
    productionSourceMap: false,
    configureWebpack: config => {
        // 如果是在线上环境
        if (ENV === 'production') {
            config.externals = externals
            config.plugins.push(

                // 解决端口被占用的问题
                new BundleAnalyzerPlugin({
                    analyzerMode: 'server',
                    analyzerHost: '127.0.0.1',//ip地址
                    analyzerPort: 8880,//设置个未使用的端口就行,默认端口为8888
                    reportFilename: 'report.html',
                    defaultSizes: 'parsed',
                    openAnalyzer: true,//浏览器自动打开
                    generateStatsFile: false,
                    statsFilename: 'stats.json',
                    statsOptions: null,
                    logLevel: 'info'
                }),
                // gzip,压缩js
                new CompressionWebpackPlugin({
                    filename: '[path].gz[query]',//压缩文件的输入路径和名称
                    algorithm: "gzip",//表示使用gzip算法进行压缩
                    test: /\.(js|css|html)?$/i,//正则匹配文件名
                    threshold: 10240,//文件大小阀值,大于或者等于10240字节(10kb)
                    minRatio: 0.8,//最小压缩比例,只有压缩后大小与原始大小的比例大于等于该值时,才会保留压缩后的文件。这里设置为 0.8,表示压缩后的文件大小至少为原始文件大小的 80%。
                    deleteOriginalAssets: false,//保留原始文件
                    cache: false// 不启用文件缓存
                }),
                new HappyPack({
                    id: 'happybabel',
                    loaders: ['babel-loader'],
                    threadPool: happyThreadPool
                })
            )


        }
    },
    chainWebpack: (config) => {
        // 删除需要预先加载(当前页面)的资源,当需要这些资源的时候,页面会自动加载
        config.plugins.delete('preload')
        // 删除需要预先获取(将来的页面)的资源
        config.plugins.delete('prefetch')
        config.when(ENV === 'production', config => {
            config.plugin('webpackOptimize')
                .use(
                    webpack.optimize.LimitChunkCountPlugin,
                    // 限制生成的代码块(chunks)的数量
                    [{ maxChunks: 10 }]
                )
                .use(
                    webpack.optimize.MinChunkSizePlugin,
                    // 指定代码块的最小字节数
                    [{ minChunkSize: 50000 }]
                )
        })
        /**
   * 添加 CDN 参数到 htmlWebpackPlugin 配置中
   */
        config.plugin('html').tap(args => {
            if (process.env.NODE_ENV === 'production') {
                args[0].cdn = cdn
            } else {
                args[0].cdn = []
            }
            return args
        })
    }
}

未完待续。。。

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

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

相关文章

openGauss学习笔记-102 openGauss 数据库管理-管理数据库安全-客户端接入之查看数据库连接数

文章目录 openGauss学习笔记-102 openGauss 数据库管理-管理数据库安全-客户端接入之查看数据库连接数102.1 背景信息102.2 操作步骤 openGauss学习笔记-102 openGauss 数据库管理-管理数据库安全-客户端接入之查看数据库连接数 102.1 背景信息 当用户连接数达到上限后&#…

单片机入门后该怎么学习进一步提升?

单片机入门后该怎么学习进一步提升&#xff1f; 可以将你目前会的单片机基础先整理一下&#xff0c;你看看运用这些基本的外设或者一些入门知识能做个什么东西&#xff0c;最近很多小伙伴找我&#xff0c;说想要一些单片机资料&#xff0c;然后我根据自己从业十年经验&#xff…

Redis主从复制流程

前言 Redis 支持部署多节点&#xff0c;然后按照 1:n 的方式构建主从集群&#xff0c;即一个主库、n 个从库。主从库之间会自动进行数据同步&#xff0c;但是只有主库同时允许读写&#xff0c;从库只允许读。 搭建主从复制集群的目的&#xff1a; 从库可用于容灾备份从库可以…

Unity3D 基础——使用 Mathf.SmoothDamp 函数制作相机的缓冲跟踪效果

使用 Mathf.SmoothDamp 函数制作相机的缓冲跟踪效果&#xff0c;让物体的移动不是那么僵硬&#xff0c;而是做减速的缓冲效果。将以下的脚本绑定在相机上&#xff0c;然后设定好 target 目标对象&#xff0c;即可看到相机的缓动效果。通过设定 smoothTime 的值&#xff0c;可以…

安达发|AI人工智能APS系统:工业4.0的智能引擎

在工业4.0的背景下&#xff0c;人工智能&#xff08;AI&#xff09;和APS智能排程软件已经成为智能工厂的标准配置。它们通过集成先进的信息技术、通信技术和物联网技术&#xff0c;实现了生产过程的智能化、自动化和数据化&#xff0c;从而提高了生产效率、降低了生产成本、提…

运行.sln 32/64位程序,启动不了,无法显示界面

32/64位启动不了&#xff0c;无法显示界面。后台有进程 》环境变量--轴控下&#xff0c;选择的“串口”选择了虚拟串口(比如&#xff1a;com3&#xff0c;是蓝牙串口)&#xff0c;或者因为当前机台以前虚拟过这个串口&#xff0c;所以存在。串口存在&#xff0c;就会去调用函数…

微信小程序----会议oa项目---首页

目录 什么是Flex弹性布局 图解 代码演示 flex弹性布局的特点 Flex 弹性布局的常见属性 flex-wrap属性 flex-flow属性 轮播图后台数据获取及组件使用 首页布局 什么是Flex弹性布局 Flex 弹性布局&#xff08;Flexbox&#xff09;是一种用于在容器中进行灵活排列和对齐元素的…

Java数据结构——应用DFS算法计算流程图下游节点(1)

问题描述&#xff1a; 前端在绘制流程图的时候&#xff0c;某些情况需要对某个节点之后的流程图进行折叠&#xff0c;因此需要得到某个节点的ID后&#xff0c;计算出这个ID下游之后的所有节点&#xff08;找到的节点&#xff0c;边也就找到了&#xff09; 已知条件&#xff1a…

【vscode编辑器插件】前端 php unity自用插件分享

文章目录 一篇一句前言前端vuegitphpunity后端其他待续完结 一篇一句 “思考是最困难的工作&#xff0c;这也许是为什么很少有人这样做。” - 亨利福特&#xff08;Henry Ford&#xff09; 前言 无论是什么语言&#xff0c;我都会选择使用vscode进行开发&#xff0c;我愿称v…

2023亿发智能数字化解决方案供应商,贵州一体化企业信息管理系统

企业数字化服务的解决方案是指运用数字技术对企业运营进行全方位的数字化升级和优化&#xff0c;提供以数字化服务为核 心的全面解决方案&#xff0c;解决企业在数字化转型过程中面临的技术和业务难题。 数字化服务解决方案的功能 在数字化时代的背景下&#xff0c;贵州企业的…

京东店铺商品评论数据采集,京东商品评论数据接口,京东API接口

京东店铺商品评论数据接口可以获取到商品ID&#xff0c;商品标题&#xff0c;商品优惠券&#xff0c;商品到手价&#xff0c;商品价格&#xff0c;商品优惠价&#xff0c;商品sku属性&#xff0c;商品图片&#xff0c;商品视频&#xff0c;商品sku属性图片&#xff0c;商品属性…

协同过滤电影推荐系统 计算机竞赛

文章目录 1 简介1 设计概要2 课题背景和目的3 协同过滤算法原理3.1 基于用户的协同过滤推荐算法实现原理3.1.1 步骤13.1.2 步骤23.1.3 步骤33.1.4 步骤4 4 系统实现4.1 开发环境4.2 系统功能描述4.3 系统数据流程4.3.1 用户端数据流程4.3.2 管理员端数据流程 4.4 系统功能设计 …

万界星空科技/生产制造管理MES系统/开源MES/免费MES

一、 开源系统概述&#xff1a; 万界星空科技免费MES、开源MES、商业开源MES、市面上最好的开源MES、MES源代码、免费MES、免费智能制造系统、免费排产系统、免费排班系统、免费质检系统、免费生产计划系统、免费仓库管理系统、免费出入库管理系统、免费可视化数字大屏。 万界…

centos 7.9 安装sshpass

1.作用 sshpass是一个用于非交互式SSH密码验证的实用程序。它可以用于自动输入密码以进行SSH登录&#xff0c;从而简化了自动化脚本和批处理作业中的SSH连接过程。 sshpass命令可以与ssh命令一起使用&#xff0c;通过在命令行中提供密码参数来执行远程命令。以下是一个示例命…

KVM/qemu安装UOS 直接让输入用户密码

错误信息 安装后出现&#xff1a; 1、点击刚刚建立的虚拟机最上角感叹号&#xff08;设备管理器&#xff09; ----新建硬件---输入----类型&#xff1a;【通用 USB Mouse】。 ----新建硬件---输入----类型&#xff1a;【通用 USB keyboard】。 2、在设备管理器中----新建硬…

全流程TOUGH系列软件应用

TOUGH系列软件是由美国劳伦斯伯克利实验室开发的&#xff0c;旨在解决非饱和带中地下水、热运移的通用模拟软件。和传统地下水模拟软件Feflow和Modflow不同&#xff0c;TOUGH系列软件采用模块化设计和有限积分差网格剖分方法&#xff0c;通过配合不同状态方程&#xff08;EOS模…

天锐绿盾透明加密、半透明加密、智能加密这三种不同加密模式的区别和适用场景——@德人合科技-公司内部核心文件数据、资料防止外泄系统

由于企事业单位海量的内部数据存储情况复杂&#xff0c;且不同公司、不同部门对于文件加密的需求各不相同&#xff0c;单一的加密系统无法满足多样化的加密需求。天锐绿盾企业加密系统提供多种不同的加密模式&#xff0c;包括透明加密、半透明加密和智能加密&#xff0c;用户可…

印尼禁令频出,Shopee该站也停止销售跨境商品

日前&#xff0c;Shopee印尼站已经正式停止销售来自海外或跨境卖家的商品&#xff0c;这一举措于10月4日开始施行。 Shopee印尼公共政策负责人Radityo Triatmojo表示&#xff0c;该举措系对印尼2023年第31号贸易部长条例&#xff08;Reg 31/2023&#xff09;的响应。该条例旨在…

Compose Canvas基础(2) 图形转换

Compose Canvas基础&#xff08;2&#xff09;图形转换 前言平移 translate缩放 scale旋转 rotate自定义绘图区域及绘制内边距inset组合转换 withTransform完整代码总结 上一篇文章 Compose Canvas基础&#xff08;1&#xff09; drawxxx方法 前言 阅读本文需要一定compose基…

1347. 制造字母异位词的最小步骤数 (中等,Counter)

闲来无事&#xff0c;今天多做一题 条件很宽&#xff0c;可以任意替换&#xff0c;且排列相同也可以所以只要统计每个字母在 s 中比在 t 中多出现的次数之和即可 class Solution:def minSteps(self, s: str, t: str) -> int:n [0] * 26for i in s:n[ord(i) - ord(a)] 1f…