Firefox 3.5.1 正式版下载

Mozilla 发布了 Firefox 3.5 的首个升级版本 3.5.1,该版本着重修复了一些稳定性和安全性问题,包括 JIT JavaScript 编译器的高危漏洞。此外,新版本声称解决了部分 Windows 系统中加载时间过长的问题。
Firefox 3.5发布后的第一个升级版本3.5.1已经新鲜出炉了。 根据Mozilla的官方发行说明,Firefox 3.5.1重点解决了一些稳定性和安全性问题,特别是日前公开曝光的JIT JavaScript编译器高危漏洞。 新版本还声称解决了“在部分Windows系统上需要很长时间才能载入的问题”,不知道能否真的解决用户普遍反应的启动速度慢的问题。 从关于对话框看,Firefox 3.5.1编译于7月15日,算上时差才刚刚完成不过一天。 Windows英文版: http://download.mozilla.org/?product=firefox-3.5.1&os=win&lang=en-US Windows简体中文版: http://download.mozilla.org/?product=firefox-3.5.1&os=win&lang=zh-CN Mac OS X简体中文版: http://download.mozilla.org/?product=firefox-3.5.1&os=osx&lang=zh-CN Linux简体中文版: http://download.mozilla.org/?product=firefox-3.5.1&os=linux&lang=zh-CN (驱动之家)
{ "name": "@jsxc/jsxc", "version": "4.4.0", "description": "Real-time XMPP chat application with video calls, file transfer and encrypted communication", "keywords": [ "XMPP", "client", "browser", "video", "file transfer", "real-time" ], "homepage": "https://www.jsxc.org/", "bugs": "https://github.com/jsxc/jsxc/issues", "license": "MIT", "author": "Klaus Herberth <klaus@jsxc.org>", "main": "src/index.ts", "repository": { "type": "git", "url": "https://github.com/jsxc/jsxc" }, "scripts": { "start": "webpack --progress --config webpack.config.js --mode production", "watch": "webpack --progress --config webpack.config.js --mode development --watch", "build": "webpack --progress --config webpack.config.js --mode production", "build:analyze": "webpack --progress --config webpack.config.js --mode development --env bundleAnalyzer=true", "dev": "webpack serve --progress --mode development", "test": "karma start --single-run", "fix": "run-p --continue-on-error --print-label fix-*", "fix-typescript-format": "eslint \"src/**/*.ts\" --fix && prettier src/ --write", "fix-style-format": "stylelint \"scss/**/*.scss\" --fix", "checking": "run-p --continue-on-error --print-label checking-**", "checking-style-format": "stylelint --cache \"scss/**/*.scss\"", "checking-typescript-format": "eslint \"src/**/*.ts\" && prettier src/ --check", "checking-typescript": "tsc --noEmit", "lint:staged": "lint-staged" }, "husky": { "hooks": { "prepare-commit-msg": "node scripts/prepare-commit-msg.js HUSKY_GIT_PARAMS", "pre-commit": "run-s lint:staged checking-typescript", "commit-msg": "commitlint -E HUSKY_GIT_PARAMS" } }, "lint-staged": { "src/*": [ "eslint", "prettier --check" ], "scss/*": [ "stylelint --cache" ] }, "devDependencies": { "@commitlint/cli": "^12.0.1", "@commitlint/config-conventional": "^12.0.1", "@commitlint/travis-cli": "^12.0.1", "@octokit/rest": "^18.0.9", "@types/chai": "^4.2.14", "@types/emojione": "^2.2.5", "@types/handlebars": "^4.1.0", "@types/jquery": "^3.5.4", "@types/mocha": "^8.2.2", "@types/node": "^14.14.9", "@types/sinon": "^9.0.9", "@types/strophe.js": "^1.2.0", "@typescript-eslint/eslint-plugin": "^4.14.0", "@typescript-eslint/parser": "^4.14.0", "archiver": "^5.1.0", "buffer": "^6.0.3", "chai": "^4.2.0", "copy-webpack-plugin": "^8.0.0", "css-loader": "^5.0.1", "dotenv": "^8.2.0", "eslint": "^7.18.0", "eslint-config-prettier": "^8.1.0", "eslint-plugin-import": "^2.22.1", "eslint-plugin-jsdoc": "^32.3.0", "eslint-plugin-prefer-arrow": "^1.2.2", "execa": "^5.0.0", "fork-ts-checker-webpack-plugin": "^6.2.0", "git-branch": "^2.0.1", "git-revision-webpack-plugin": "^3.0.6", "husky": "^4.3.0", "inquirer": "^8.0.0", "istanbul": "^0.4.5", "js-beautify": "^1.13.0", "karma": "^6.2.0", "karma-chai": "^0.1.0", "karma-chrome-launcher": "^3.0.0", "karma-firefox-launcher": "^2.1.0", "karma-mocha": "^2.0.1", "karma-mocha-reporter": "^2.2.5", "karma-phantomjs-launcher": "^1.0.4", "karma-sinon": "^1.0.5", "karma-spec-reporter": "^0.0.32", "karma-typescript": "^5.2.0", "karma-webpack": "^5.0.0", "lint-staged": "^10.5.3", "mocha": "^8.2.1", "npm-run-all": "^4.1.5", "process": "^0.11.10", "sass-loader": "^11.0.1", "simple-git": "^2.23.0", "sinon": "^9.2.1", "stream-browserify": "^3.0.0", "stylelint": "^13.8.0", "stylelint-config-sass-guidelines": "^8.0.0", "terser-webpack-plugin": "^5.1.1", "ts-loader": "^8.0.11", "ts-node": "^9.0.0", "tslib": "^2.0.3", "typescript": "^4.1.2", "typescript-formatter": "^7.2.2", "webpack": "^5.27.0", "webpack-bundle-analyzer": "^4.1.0", "webpack-cli": "^4.2.0", "webpack-dev-server": "^3.7.2" }, "dependencies": { "@types/qrcode": "^1.3.5", "bootstrap-sass": "^3.4.1", "bytebuffer": "^5.0.1", "consistent-color-generation": "^0.4.0", "emojione": "2.2.x", "file-loader": "^6.2.0", "getscreenmedia": "^5.1.2", "handlebars": "^4.7.6", "handlebars-loader": "^1.7.1", "handlebars-runtime": "^1.0.12", "i18next": "^20.3.2", "i18next-browser-languagedetector": "^6.0.1", "interactjs": "^1.10.0", "jingle": "^3.0.3", "jingle-session": "^2.0.3", "jquery": "^3.5.1", "jxt": "^4.0.2", "jxt-xmpp": "^3.3.0", "jxt-xmpp-types": "^3.0.0", "mini-css-extract-plugin": "^1.3.1", "moment": "^2.29.1", "otr": "https://github.com/sualko/otr.git#1ee459b4eda85d0a7d76d7da7b3a36861294346e", "precompile-handlebars": "^1.0.5", "prettier": "^2.2.1", "qrcode": "^1.4.4", "sass": "^1.32.8", "screenfull": "^5.0.2", "sha1": "^1.1.1", "strophe.js": "^1.4.0", "util": "^0.12.3", "webrtc-adapter": "^7.7.0" } } 让这二个源文件 配套完整生成可部署的完整版源文件 /* jshint node:true */ const path = require(&#39;path&#39;); const fs = require(&#39;fs&#39;); const webpack = require(&#39;webpack&#39;); const packageJson = require(&#39;./package.json&#39;); const MiniCssExtractPlugin = require(&#39;mini-css-extract-plugin&#39;); const CopyWebpackPlugin = require(&#39;copy-webpack-plugin&#39;); const BundleAnalyzerPlugin = require(&#39;webpack-bundle-analyzer&#39;).BundleAnalyzerPlugin; const TerserPlugin = require(&#39;terser-webpack-plugin&#39;); const ForkTsCheckerWebpackPlugin = require(&#39;fork-ts-checker-webpack-plugin&#39;); // === Git Revision Plugin with Fallback & Logging === let gitRevisionPlugin; try { const GitRevisionPlugin = require(&#39;git-revision-webpack-plugin&#39;); gitRevisionPlugin = new GitRevisionPlugin({ commithashCommand: &#39;git rev-parse HEAD&#39;, versionCommand: &#39;git describe --always --dirty&#39;, }); // 强制测试是否能获取 commit(避免 silent fail) gitRevisionPlugin.commithash(); } catch (e) { console.warn(&#39;[Git] Not available:&#39;, e.message); gitRevisionPlugin = { version: () => &#39;unknown&#39;, commithash: () => &#39;unknown&#39;, branch: () => &#39;unknown&#39; }; } // === 支持的语言列表 === let supportedLangs = fs.readdirSync(&#39;./locales/&#39;) .filter(filename => /\.json$/.test(filename)) .map(filename => { try { const file = require(`./locales/${filename}`); return Object.values(file.translation).some(v => typeof v === &#39;string&#39;) ? filename : null; } catch { return null; } }) .filter(Boolean) .map(filename => filename.replace(/\.json$/, &#39;&#39;)); const MOMENTJS_LOCALES = [...new Set(supportedLangs.map(lang => lang.split(&#39;-&#39;)[0]))]; // en, de, zh const JS_BUNDLE_NAME = &#39;jsxc.bundle.js&#39;; // === 依赖许可证收集 === const dependencies = Object.keys(packageJson.dependencies).map(name => { try { const pkg = require(`./node_modules/${name}/package.json`); return `${pkg.name}@${pkg.version} (${pkg.license || &#39;unknown&#39;})`; } catch { return `${name}@unknown (unknown)`; } }).join(&#39;, &#39;); // === 版本与构建时间 === let version = packageJson.version; if (!process.env.BUILD || !argv?.release) { version += &#39;-git.&#39; + gitRevisionPlugin.version(); } const buildDate = new Date().toISOString(); // === DefinePlugin 配置(注入全局常量)=== const definePluginConfig = { __VERSION__: JSON.stringify(version), __BUILD_DATE__: JSON.stringify(buildDate), __BUNDLE_NAME__: JSON.stringify(JS_BUNDLE_NAME), __DEPENDENCIES__: JSON.stringify(dependencies), __LANGS__: JSON.stringify(supportedLangs), &#39;process.env.NODE_DEBUG&#39;: JSON.stringify(false), }; // === File Loader:扁平化输出,避免深层路径 === const fileLoader = { loader: &#39;file-loader&#39;, options: { name: &#39;[name]-[sha1:hash:hex:8].[ext]&#39;, outputPath: &#39;assets/&#39;, publicPath: &#39;dist/assets/&#39; } }; // === 输出目录 === const OUTPUT_PATH = path.resolve(__dirname, &#39;./dist/&#39;); // === 基础配置对象 === let config = { entry: [&#39;./scss/main.scss&#39;, &#39;./src/index.ts&#39;], output: { filename: JS_BUNDLE_NAME, chunkFilename: "[name].chunk.js", path: OUTPUT_PATH, publicPath: &#39;dist/&#39;, libraryTarget: &#39;var&#39;, library: &#39;JSXC&#39;, clean: true, // Webpack 5+ 清理 dist/ }, optimization: { splitChunks: { minSize: 10, cacheGroups: { styles: { name: &#39;styles&#39;, test: /\.css$/, chunks: &#39;all&#39;, enforce: true } } }, }, performance: { maxEntrypointSize: 3 * 1024 * 1024, // 3MB maxAssetSize: 3 * 1024 * 1024, }, module: { rules: [ { test: /\.ts$/, loader: &#39;ts-loader&#39;, include: [path.resolve(__dirname, &#39;src&#39;), path.resolve(__dirname, &#39;test&#39;)], options: { transpileOnly: true, // 由 ForkTsChecker 处理类型检查 }, }, { test: /\.hbs$/, loader: &#39;handlebars-loader&#39;, include: path.resolve(__dirname, &#39;template&#39;), options: { helperDirs: [path.resolve(__dirname, &#39;template&#39;, &#39;helpers&#39;)], partialDirs: [path.resolve(__dirname, &#39;template&#39;, &#39;partials&#39;)] } }, { test: /\.css$/, use: [MiniCssExtractPlugin.loader, &#39;css-loader&#39;] }, { test: /\.(sass|scss)$/, include: path.resolve(__dirname, &#39;scss&#39;), use: [ MiniCssExtractPlugin.loader, { loader: &#39;css-loader&#39;, options: { url: false } }, &#39;sass-loader&#39; ] }, { test: /\.(png|jpg|gif|mp3|wav|svg)$/, use: [fileLoader] }, { test: /\.js$/, resourceQuery: /path/, use: [fileLoader] } ] }, resolve: { extensions: [".ts", ".js", ".hbs", ".json"], alias: { &#39;@connection&#39;: path.resolve(__dirname, &#39;src/connection/&#39;), &#39;@ui&#39;: path.resolve(__dirname, &#39;src/ui/&#39;), &#39;@util&#39;: path.resolve(__dirname, &#39;src/util/&#39;), &#39;@vendor&#39;: path.resolve(__dirname, &#39;src/vendor/&#39;), &#39;@src&#39;: path.resolve(__dirname, &#39;src/&#39;), }, fallback: { fs: false, stream: false, path: false, crypto: false, process: false, } }, externals: { &#39;child_process&#39;: &#39;child_process&#39;, &#39;webworker-threads&#39;: &#39;webworker-threads&#39; }, plugins: [ new webpack.ProvidePlugin({ $: &#39;jquery&#39;, jQuery: &#39;jquery&#39;, process: &#39;process/browser&#39;, }), new MiniCssExtractPlugin({ filename: &#39;styles/jsxc.bundle.css&#39;, }), new CopyWebpackPlugin({ patterns: [ { from: &#39;images/&#39;, to: &#39;images/&#39; }, { from: &#39;fonts/&#39;, to: &#39;fonts/&#39; }, { from: &#39;sound/&#39;, to: &#39;sound/&#39; }, { from: &#39;node_modules/emojione/assets/svg/&#39;, to: &#39;images/emojione/&#39; }, { from: &#39;LICENSE&#39;, to: &#39;LICENSE&#39; }, { from: &#39;README.md&#39;, to: &#39;README.md&#39; }, { from: &#39;example/index.html&#39;, to: &#39;example/index.html&#39; }, { from: &#39;example/css/&#39;, to: &#39;example/css/&#39; }, { from: &#39;example/js/&#39;, to: &#39;example/js/&#39; }, ], }), new webpack.LoaderOptionsPlugin({ options: { handlebarsLoader: {} } }), new webpack.ContextReplacementPlugin( /moment[/\\]locale$/, new RegExp(`^\\./(${MOMENTJS_LOCALES.join(&#39;|&#39;)})$`) ), new ForkTsCheckerWebpackPlugin(), ], devServer: { injectClient: false, port: 8091, inline: true, publicPath: &#39;/dist/&#39;, open: true, openPage: &#39;example/index.html&#39;, proxy: { "/http-bind": "http://localhost:5280", "/libsignal": "http://localhost", "/xmpp-websocket": "ws://localhost:5280" }, watchOptions: { aggregateTimeout: 1300, ignored: [ path.resolve(__dirname, &#39;dist&#39;), path.resolve(__dirname, &#39;node_modules&#39;), path.resolve(__dirname, &#39;.git&#39;), path.resolve(__dirname, &#39;test&#39;), &#39;**/*.swp&#39;, ] } }, }; // === 动态导出函数(根据 argv 修改 config)=== module.exports = (env, argv) => { if (typeof argv.mode === &#39;string&#39;) { config.mode = argv.mode; } // --- 设置输出文件名 --- if (config.mode === &#39;production&#39;) { config.output.filename = &#39;jsxc.bundle.min.js&#39;; config.devtool = &#39;source-map&#39;; // 生产环境提供 map } else { config.devtool = &#39;eval-source-map&#39;; // 开发环境更快 } // --- 生产压缩配置 --- if (config.mode === &#39;production&#39;) { config.optimization.minimizer = [ new TerserPlugin({ terserOptions: { compress: { drop_console: true, drop_debugger: true, keep_fnames: /Session$/ // WebRTC 需要保留函数名 }, format: { comments: false // 删除注释(banner 会单独加) } }, extractComments: false }) ]; } // --- 发布正式版时去掉 -git 标记 --- if (argv.release || process.env.BUILD === &#39;release&#39;) { version = packageJson.version; } // --- Bundle Analyzer 插件 --- if (argv.bundleAnalyzer || env?.bundleAnalyzer) { config.plugins.push(new BundleAnalyzerPlugin()); } // --- 注入全局变量 --- config.plugins.push(new webpack.DefinePlugin(definePluginConfig)); // --- 添加 Banner 注释 --- config.plugins.push(new webpack.BannerPlugin({ banner: `JavaScript XMPP Client - the open chat Version: ${version} Commit: ${gitRevisionPlugin.commithash()} Branch: ${gitRevisionPlugin.branch()} Build date: ${buildDate} Homepage: ${packageJson.homepage} JSXC is released under the MIT license, but this file also contains dependencies which are released under a different license. Dependencies: ${dependencies} Licensed under MIT.`, raw: false, entryOnly: true })); return config; };
最新发布
11-11
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值