Require-Bundle的缺点

本文深入探讨了Require-Bundle在OSGi框架中的使用局限,包括无法准确知晓导入的包、重构后的影响以及可能导致导入大量无用包的问题,并解释了引入Require-Bundle的主要原因是为了兼容Eclipse历史遗留问题,使得成千上万已有的Eclipse插件能够在OSGi环境下正常运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文引用自:http://blog.youkuaiyun.com/vking_wang/article/details/13240715

 

Require-Bundle的缺点

 

1、不知道究竟导入了哪些包

我们不知道究竟导入了哪些包,在不同版本中导入的包可能不同;

 

2、导出包的bundle重构后,会影响导入bundle

如果bundleA日渐臃肿,打算将其分拆成两个bundle。如果使用Import-Package,则仍能正常工作:

但是如果使用Require-Bundle,则新的bundle不会被bundleB导入;可能会抛出NoClassDefFoundErrors。

 

3、导致导入大量无用的包

即便只依赖bundleA中的一小部分代码,也需要导入其中的所有包;而bundleA又会依赖其他bundle,最终导致导入了大量无用的包。

 

为什么引入Require-Bundle?

引入Require-Bundle主要是因为Eclipse的历史遗留问题。在使用OSGi之前,Eclipse是基于全模块依赖的,如果OSGi仅仅支持Import-Package,要想让成千上万已有的Eclipse插件正常工作,几乎是不可能的。

 

'use strict'; const isProduction = process.env.NODE_ENV === 'production'; const webpack = require('webpack'); const merge = require('webpack-merge'); // webpack merge 工具包 const baseWebpackConfig = require('./webpack.base.conf'); // 基础配置引入 const TerserWebpackPlugin = require('terser-webpack-plugin'); // js压缩优先配置 const MiniCssExtractPlugin = require('mini-css-extract-plugin'); // 提取单独打包css文件 const HtmlWebpackPlugin = require('html-webpack-plugin'); const path = require('path'); const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); const CssCustomSourcemapUrlPlugin = require('css-custom-sourcemap-url-plugin'); const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; const WebpackObfuscator = require('webpack-obfuscator'); const config = require('../config'); function resolve(dir) { return path.join(__dirname, '..', dir); } const prodWebpackConfig = merge(baseWebpackConfig, { mode: 'production', // 设定环境 optimization: { // webpack4.0 新加优化策略 minimizer: [ new TerserWebpackPlugin({ parallel: true, // 开启并行压缩,充分利用cpu extractComments: false, // 移除注释 sourceMap: !isProduction, cache: true, terserOptions: { compress: { warnings: false, drop_debugger: true, drop_console: isProduction, }, output: { comments: false, // 移除所有注释 beautify: false, // 不美化,压缩成一行 ascii_only: true, // 只输出 ASCII 字符 }, }, }), new OptimizeCSSAssetsPlugin({ cssProcessorOptions: { map: { inline: false, }, autoprefixer: false, }, }), new CssCustomSourcemapUrlPlugin({ append: config.build.sourcePath, }), ], splitChunks: { chunks: 'all', name: 'vendors', }, runtimeChunk: { name: 'manifest', }, }, plugins: [ new HtmlWebpackPlugin({ pageAnalyticScript: isProduction ? config.build.pageAnalyticScript : config.dev.pageAnalyticScript, pageProbeScript: isProduction ? config.build.pageProbeScript : config.dev.pageProbeScript, escapeScript: isProduction ? config.build.escapeScript : config.dev.escapeScript, inject: true, template: 'index.html', }), // css 提取 new MiniCssExtractPlugin({ filename: 'css/[name].[contenthash:7].css', chunkFilename: 'css/[id].[contenthash:7].css', sourceMap: true, ignoreOrder: true, }), new webpack.SourceMapDevToolPlugin( isProduction ? { filename: '[file].map', append: `\n//# sourceMappingURL=${config.build.sourcePath}[url]`, } : { filename: '[file].map', }, ), // 代码混淆插件,排除 vendor 和 manifest,仅生产环境启用 ...(isProduction ? [new WebpackObfuscator( { rotateStringArray: true, stringArray: true, stringArrayEncoding: ['rc4'], stringArrayThreshold: 1, compact: true, disableConsoleOutput: true, }, ['**/vendor*.js', '**/vendors~*.js', '**/manifest.*.js'] )] : []), // new BundleAnalyzerPlugin(), // 可视化打包 ], }); module.exports = prodWebpackConfig; 这串打包逻辑中 runtimeChunk: { name: 'manifest', }, 的作用是什么,manifest又是什么
最新发布
08-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值