外国人做的网站wordpress主题大全

news/2025/9/30 11:07:28/文章来源:
外国人做的网站,wordpress主题大全,网络运营是什么工作,哪些网站可以做问卷文章目录 rollup watch 实现流程watchWatchEmitter 实现 watchInternalWatcher 管理整个 watch 阶段Task 运行任务FileWatcher 实现文件监听 rollup watch 实现流程 每一个配置了 watch 的配置项都会变成一个 Task 任务#xff0c;每个任务通过 FileWatcher 即 chokidar 进行… 文章目录 rollup watch 实现流程watchWatchEmitter 实现 watchInternalWatcher 管理整个 watch 阶段Task 运行任务FileWatcher 实现文件监听 rollup watch 实现流程 每一个配置了 watch 的配置项都会变成一个 Task 任务每个任务通过 FileWatcher 即 chokidar 进行监听需要监听的文件依赖有两种 一种是文件自身 import 的依赖会被放进 dependencies 属性里一种是文件在被插件处理的过程中通过 this.addWatchFile 时watch 的文件会放进该模块的 transformDependencies 属性里 插件里调用 this.emitFile 生成的文件会放进该模块的 transformFiles 属性里 每个 Task 通过 Watcher 进行管理 rollup 打包结果其中一个文件数据结构 {assertions: {},ast: {// 当前模块 ast },code: import _createClass from \babel/runtime/helpers/createClass\;\nimport _classCallCheck from \babel/runtime/helpers/classCallCheck\;\nimport _defineProperty from \babel/runtime/helpers/defineProperty\;\nimport \core-js/modules/es7.array.includes.js\;\nimport a from \a-test\;\nimport foo from \./foo.js\;\nimport packageJosn from \./package.json\;\nvar b require(\path\);\nvar fn function fn() {\n console.log(\index fn243\, a);\n console.log(packageJosn.version);\n console.log(b);\n};\nfn();\nvar A /*#__PURE__*/_createClass(function A() {\n _classCallCheck(this, A);\n _defineProperty(this, \a\, void 0);\n this.a \ww2\;\n});\nvar aa new A();\nvar res [];\nconsole.log(res.includes(\ff\));\nconsole.log(foo);\nexport default fn;,customTransformCache: false,dependencies: [/Users/xxx/Desktop/demo/node_modules/babel/runtime/helpers/esm/createClass.js,/Users/xxx/Desktop/demo/node_modules/babel/runtime/helpers/esm/classCallCheck.js,/Users/xxx/Desktop/demo/node_modules/babel/runtime/helpers/esm/defineProperty.js,core-js/modules/es7.array.includes.js,a-test,/Users/xxx/Desktop/demo/foo.js,/Users/xxx/Desktop/demo/package.json],id: /Users/xxx/Desktop/demo/index.js,meta: {commonjs: {hasDefaultExport: true,isCommonJS: false}},moduleSideEffects: true,originalCode: import a from \a-test\;\nimport foo from \./foo.js\;\nimport packageJosn from \./package.json\;\nconst b require(\path\);\n\nconst fn () {\n console.log(\index fn243\, a);\n console.log(packageJosn.version);\n console.log(b);\n};\nfn();\n\nclass A {\n a;\n constructor() {\n this.a \ww2\;\n }\n}\n\nconst aa new A();\n\nlet res [];\nconsole.log(res.includes(\ff\));\n\nconsole.log(foo);\n\nexport default fn;\n,originalSourcemap: null,resolvedIds: {./package.json: {assertions: {},external: false,id: /Users/xxx/Desktop/demo/package.json,meta: {},moduleSideEffects: true,resolvedBy: node-resolve,syntheticNamedExports: false},core-js/modules/es7.array.includes.js: {assertions: {},external: true,id: core-js/modules/es7.array.includes.js,meta: {},moduleSideEffects: true,resolvedBy: rollup,syntheticNamedExports: false},./foo.js: {assertions: {},external: false,id: /Users/xxx/Desktop/demo/foo.js,meta: {},moduleSideEffects: true,resolvedBy: node-resolve,syntheticNamedExports: false},a-test: {assertions: {},external: true,id: a-test,meta: {},moduleSideEffects: true,resolvedBy: rollup,syntheticNamedExports: false},babel/runtime/helpers/defineProperty: {assertions: {},external: false,id: /Users/xxx/Desktop/demo/node_modules/babel/runtime/helpers/esm/defineProperty.js,meta: {},moduleSideEffects: true,resolvedBy: node-resolve,syntheticNamedExports: false},babel/runtime/helpers/createClass: {assertions: {},external: false,id: /Users/xxx/Desktop/demo/node_modules/babel/runtime/helpers/esm/createClass.js,meta: {},moduleSideEffects: true,resolvedBy: node-resolve,syntheticNamedExports: false},babel/runtime/helpers/classCallCheck: {assertions: {},external: false,id: /Users/xxx/Desktop/demo/node_modules/babel/runtime/helpers/esm/classCallCheck.js,meta: {},moduleSideEffects: true,resolvedBy: node-resolve,syntheticNamedExports: false}},sourcemapChain: [{version: 3,names: [a,foo,packageJosn,b,require,fn,console,log,version,A,_createClass,_classCallCheck,_defineProperty,aa,res,includes],sources: [index.js],sourcesContent: [import a from \a-test\;\nimport foo from \./foo.js\;\nimport packageJosn from \./package.json\;\nconst b require(\path\);\n\nconst fn () {\n console.log(\index fn243\, a);\n console.log(packageJosn.version);\n console.log(b);\n};\nfn();\n\nclass A {\n a;\n constructor() {\n this.a \ww2\;\n }\n}\n\nconst aa new A();\n\nlet res [];\nconsole.log(res.includes(\ff\));\n\nconsole.log(foo);\n\nexport default fn;\n],mappings: [// ...],syntheticNamedExports: false,transformDependencies: [./index2.ts],transformFiles: [{type: asset,source: export default what}] }watch 当 rollup 配置了 watch 监听文件更改后打包时会调用下面的函数WatchEmitter 和 node emiter 实现类似都是发布订阅 WatchEmitter 是暴露给开发者可以在 rollup watch 各个阶段订阅watchInternal 是 rollup 真正内部进行监听的方法会在各个阶段调用 WatchEmitter 发布 export default function watch(configs: RollupOptions[] | RollupOptions): RollupWatcher {const emitter new WatchEmitter() as RollupWatcher; // 对外暴露给用户注册 watch 过程相关的事件订阅器// 真正内部实现监听的方法watchInternal(configs, emitter).catch(error {handleError(error);});return emitter; // 对外暴露给用户注册的和 watch 相关的 emitter 事件 注册的事件会在 watchInternal 中运行各个阶段触发 }WatchEmitter 实现 import type { AwaitedEventListener, AwaitingEventEmitter } from ../rollup/types;export class WatchEmitterT extends { [event: string]: (...parameters: any) any }implements AwaitingEventEmitterT {private currentHandlers: {[K in keyof T]?: AwaitedEventListenerT, K[];} Object.create(null);private persistentHandlers: {[K in keyof T]?: AwaitedEventListenerT, K[];} Object.create(null);// Will be overwritten by Rollupasync close(): Promisevoid {}emitK extends keyof T(event: K, ...parameters: ParametersT[K]): Promiseunknown {return Promise.all([...this.getCurrentHandlers(event), ...this.getPersistentHandlers(event)].map(handler handler(...parameters)));}offK extends keyof T(event: K, listener: AwaitedEventListenerT, K): this {const listeners this.persistentHandlers[event];if (listeners) {// A hack stolen from mitt: 0 does not change numbers 0, but -1// (which would remove the last array element if used unchanged) is turned// into max_int, which is outside the array and does not change anything.listeners.splice(listeners.indexOf(listener) 0, 1);}return this;}onK extends keyof T(event: K, listener: AwaitedEventListenerT, K): this {this.getPersistentHandlers(event).push(listener);return this;}onCurrentRunK extends keyof T(event: K, listener: AwaitedEventListenerT, K): this {this.getCurrentHandlers(event).push(listener);return this;}onceK extends keyof T(event: K, listener: AwaitedEventListenerT, K): this {const selfRemovingListener: AwaitedEventListenerT, K (...parameters) {this.off(event, selfRemovingListener);return listener(...parameters);};this.on(event, selfRemovingListener);return this;}removeAllListeners(): this {this.removeListenersForCurrentRun();this.persistentHandlers Object.create(null);return this;}removeListenersForCurrentRun(): this {this.currentHandlers Object.create(null);return this;}private getCurrentHandlersK extends keyof T(event: K): AwaitedEventListenerT, K[] {return this.currentHandlers[event] || (this.currentHandlers[event] []);}private getPersistentHandlersK extends keyof T(event: K): AwaitedEventListenerT, K[] {return this.persistentHandlers[event] || (this.persistentHandlers[event] []);} } watchInternal const optionsList await Promise.all(ensureArray(configs).map(config mergeOptions(config))); // 和内置 options 合并 const watchOptionsList optionsList.filter(config config.watch ! false); // 只拿到配置了 watch 的 options 配置 if (watchOptionsList.length 0) {return error(errorInvalidOption(watch,URL_WATCH,there must be at least one config where watch is not set to false)); } await loadFsEvents(); // 加载 mac 下的监听文件变化的第三方库fsevents const { Watcher } await import(./watch); // 真正内部实现监听的 watcher new Watcher(watchOptionsList, emitter);Watcher 管理整个 watch 阶段 每个 rollup 的打包配置项对应一个 Task 任务Watcher 类的作用就是管理每一个 Task 的运行 export class Watcher {readonly emitter: RollupWatcher;private buildDelay 0;private buildTimeout: NodeJS.Timer | null null;private closed false;private readonly invalidatedIds new Mapstring, ChangeEvent(); // 收集 watch 过程每一次变化的文件 id 及其对应的事件private rerun false;private running true;private readonly tasks: Task[];// optionsList 所有配置了 watch 的 option; emitter 暴露给用户注册 watch 过程相关事件的订阅器constructor(optionsList: readonly MergedRollupOptions[], emitter: RollupWatcher) {this.emitter emitter;emitter.close this.close.bind(this);this.tasks optionsList.map(options new Task(this, options)); // 每一个配置了 watch 的 option 都对应一个 TaskTask 内通过 FileWatcher 实现了通过 chokidar 进行监听for (const { watch } of optionsList) {// 每次重新运行的防抖时间if (watch typeof watch.buildDelay number) {this.buildDelay Math.max(this.buildDelay, watch.buildDelay!);}}// 初始执行process.nextTick(() this.run());}async close(): Promisevoid {if (this.closed) return;this.closed true;if (this.buildTimeout) clearTimeout(this.buildTimeout);for (const task of this.tasks) {task.close();}await this.emitter.emit(close);this.emitter.removeAllListeners();}// 文件变化后调用此函数重新打包invalidate(file?: { event: ChangeEvent; id: string }): void {if (file) {const previousEvent this.invalidatedIds.get(file.id);const event previousEvent ? eventsRewrites[previousEvent][file.event] : file.event;// 为每一个变换了的文件 id 设置对应的事件 delete | add ...if (event buggy) {//TODO: throws or warn? Currently just ignore, uses new eventthis.invalidatedIds.set(file.id, file.event);} else if (event null) {this.invalidatedIds.delete(file.id);} else {this.invalidatedIds.set(file.id, event);}}if (this.running) {this.rerun true;return;}if (this.buildTimeout) clearTimeout(this.buildTimeout);// 定时器防抖触发 rollup 重新 runthis.buildTimeout setTimeout(async () {this.buildTimeout null;try {// 文件变化后触发对应emitterawait Promise.all([...this.invalidatedIds].map(([id, event]) this.emitter.emit(change, id, { event })));this.invalidatedIds.clear();await this.emitter.emit(restart);this.emitter.removeListenersForCurrentRun(); // 取消当前过程注册的所有事件// 重新打包this.run();} catch (error: any) {this.invalidatedIds.clear();await this.emitter.emit(event, {code: ERROR,error,result: null});await this.emitter.emit(event, {code: END});}}, this.buildDelay);}private async run(): Promisevoid {this.running true;await this.emitter.emit(event, {code: START});// 根据配置项重新运行 rollupfor (const task of this.tasks) {await task.run();}this.running false;await this.emitter.emit(event, {code: END});if (this.rerun) {this.rerun false;this.invalidate();}} }Task 运行任务 每一个配置了 watch 的 rollup 选项都会变成一个单独的 Task每一个Task 都管理每一次运行任务 export class Task {cache: RollupCache { modules: [] };watchFiles: string[] [];private closed false;private readonly fileWatcher: FileWatcher; // 真正去实现监听的 watcherprivate filter: (id: string) boolean; // 过滤监听private invalidated true;private readonly options: MergedRollupOptions;private readonly outputFiles: string[];private readonly outputs: OutputOptions[];private skipWrite: boolean;private watched new Setstring(); // 收集每次监听的文件 idprivate readonly watcher: Watcher; // watcher 为管理 Task 的 Watcherconstructor(watcher: Watcher, options: MergedRollupOptions) {this.watcher watcher; // watcher 为管理 Task 的Watcherthis.options options;// 是否跳过输出文件this.skipWrite Boolean(options.watch options.watch.skipWrite);this.outputs this.options.output;// 解析输出文件地址的路径this.outputFiles this.outputs.map(output {if (output.file || output.dir) return resolve(output.file || output.dir!);return undefined as never;});const watchOptions: WatcherOptions this.options.watch || {};// 创建 watch 中配置了 exclude、include 相关的过滤方法this.filter createFilter(watchOptions.include, watchOptions.exclude);this.fileWatcher new FileWatcher(this, {...watchOptions.chokidar,disableGlobbing: true,ignoreInitial: true});}close(): void {this.closed true;this.fileWatcher.close();}// chokidar 监听到文件变化后触发 id 变化的文件 id; event 对应的文件变化类型; isTransformDependency 当前模块在插件中额外依赖的 idinvalidate(id: string, details: { event: ChangeEvent; isTransformDependency?: boolean }): void {this.invalidated true;// 当前模块在 rollup 打包时插件中添加的依赖模块// 当依赖模块更新后该模块缓存失效清空if (details.isTransformDependency) {for (const module of this.cache.modules) {// 插件里调用 this.addWatchFile 时watch的文件会放进该模块的 transformDependencies 属性里// 插件里调用 this.emitFile 生成的文件会放进该模块的 transformFiles 属性里if (!module.transformDependencies.includes(id)) continue;// effective invalidationmodule.originalCode null as never; // 清除缓存的内容后续重新生成}}this.watcher.invalidate({ event: details.event, id });}async run(): Promisevoid {if (!this.invalidated) return; // 是否在运行中this.invalidated false;const options {...this.options,cache: this.cache};const start Date.now();await this.watcher.emitter.emit(event, {code: BUNDLE_START,input: this.options.input,output: this.outputFiles});let result: RollupBuild | null null;try {result await rollupInternal(options, this.watcher.emitter); // 到此和非 watch 模式下一致if (this.closed) {return;}// 打包完成获取到所有需要监听变化的文件 idthis.updateWatchedFiles(result);this.skipWrite || (await Promise.all(this.outputs.map(output result!.write(output))));await this.watcher.emitter.emit(event, {code: BUNDLE_END,duration: Date.now() - start,input: this.options.input,output: this.outputFiles,result});} catch (error: any) {if (!this.closed) {if (Array.isArray(error.watchFiles)) {for (const id of error.watchFiles) {this.watchFile(id);}}if (error.id) {this.cache.modules this.cache.modules.filter(module module.id ! error.id);}}await this.watcher.emitter.emit(event, {code: ERROR,error,result});}}// 添加打包过程需要的所有监听文件、清除不需要的监听文件private updateWatchedFiles(result: RollupBuild) {const previouslyWatched this.watched;this.watched new Set();// 返回本次打包运行监听的文件 idthis.watchFiles result.watchFiles;// 缓存打包结果this.cache result.cache!;for (const id of this.watchFiles) {this.watchFile(id);}// 获取缓存文件的 idfor (const module of this.cache.modules) {// 在插件中添加的需要观测的依赖for (const depId of module.transformDependencies) {this.watchFile(depId, true);}}// 取消监听上一轮不需要监听的文件 idfor (const id of previouslyWatched) {if (!this.watched.has(id)) {this.fileWatcher.unwatch(id);}}}private watchFile(id: string, isTransformDependency false) {if (!this.filter(id)) return;this.watched.add(id); // 收集每次监听的文件 idif (this.outputFiles.includes(id)) {throw new Error(Cannot import the generated bundle);}// this is necessary to ensure that any renamed files// continue to be watched following an errorthis.fileWatcher.watch(id, isTransformDependency);} }FileWatcher 实现文件监听 import { platform } from node:os; import chokidar, { type FSWatcher } from chokidar; import type { ChangeEvent, ChokidarOptions } from ../rollup/types; import type { Task } from ./watch;export class FileWatcher {private readonly chokidarOptions: ChokidarOptions;private readonly task: Task;private readonly transformWatchers new Mapstring, FSWatcher(); // 收集所有监听插件中添加的依赖文件的 chokdir watcherprivate readonly watcher: FSWatcher; // 正常的 Task 对应的 chokidar watcherconstructor(task: Task, chokidarOptions: ChokidarOptions) {this.chokidarOptions chokidarOptions; // 用户传递的 chokidar 配置this.task task; // 每一个带有 watch 的 option 对应的 Taskthis.watcher this.createWatcher(null); // 通过 chokidar 监听的实例}close(): void {this.watcher.close();for (const watcher of this.transformWatchers.values()) {watcher.close();}}unwatch(id: string): void {this.watcher.unwatch(id);const transformWatcher this.transformWatchers.get(id);if (transformWatcher) {this.transformWatchers.delete(id);transformWatcher.close();}}watch(id: string, isTransformDependency: boolean): void {// 如果是插件中添加的依赖文件单独生成一个 chokidar watcherif (isTransformDependency) {const watcher this.transformWatchers.get(id) ?? this.createWatcher(id);watcher.add(id);this.transformWatchers.set(id, watcher);} else {this.watcher.add(id);}}// transformWatcherId 区分是否是插件中添加的依赖发生了变化private createWatcher(transformWatcherId: string | null): FSWatcher {const task this.task;const isLinux platform() linux;const isTransformDependency transformWatcherId ! null;// chokidar 监听到文件变化时触发的回调const handleChange (id: string, event: ChangeEvent) {const changedId transformWatcherId || id;if (isLinux) {// unwatching and watching fixes an issue with chokidar where on certain systems,// a file that was unlinked and immediately recreated would create a change event// but then no longer any further eventswatcher.unwatch(changedId);watcher.add(changedId);}// 重新运行打包task.invalidate(changedId, { event, isTransformDependency });};// 通过 chokidar 进行监听const watcher chokidar.watch([], this.chokidarOptions).on(add, id handleChange(id, create)).on(change, id handleChange(id, update)).on(unlink, id handleChange(id, delete));return watcher;} }

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

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

相关文章

DSA:DeepSeek Sparse Attention

DeepSeek-V3.2-Exp 是一个基于稀疏注意力机制(DSA,DeepSeek Sparse Attention)优化的长上下文处理模型,其核心创新在于高效地处理长序列输入,同时保持模型性能。🧠 什么是 DSA(DeepSeek Sparse Attention)? …

网站资讯如何做成都网站开发哪家好

PHPExcel是一个PHP类库,用来帮助我们简单、高效实现从Excel读取Excel的数据和导出数据到Excel。下面是PHPExcel读取的使用教程:1.首先下载PHPExcel2.下载好文件,解压可以得到如下文件:为了使用方便,我们可以在根目录创…

荒野猎手出击!启明智显ZX7981PO:专治各种恶劣环境的5G插卡路由器

在工地、在巴士、在露营地、在户外直播现场……你是否曾因网络不稳定而错失重要时刻?是否曾因设备无法承受严苛环境而影响工作进度?现在,启明智显ZX7981PO荒野猎手来了! 这款专为户外严苛场景设计的5G插卡路由器,…

AWS CDK重构功能发布:安全重构基础设施即代码

AWS宣布推出CDK重构功能,帮助开发者在重命名构造、跨堆栈迁移资源和重组CDK应用时保留现有AWS资源,避免因逻辑ID变更导致的资源替换风险,显著提升基础设施代码重构的安全性。我们很高兴宣布一项新的AWS Cloud Devel…

开发即时通社交软件APP首选系统,可定制开发,可提供源码

开发即时通社交软件APP首选系统,可定制开发,可提供源码一、产品定位​信贸通即时通(SEMOT Instant messaging system),是一款跨平台可定制的 P2P 即时通信系统。它专为电子商务网站、各行业门户网站及企事业单位打…

死锁的处理策略-死锁的检测和解除

这两个是允许死锁发生的方法 死锁的检测 为了能对系统是否已经发生了死锁进行检测,必须: 1.用某种数据结构来保存资源的请求和分配信息; 2.提供一种算法。利用上述的信息来检测系统是否已经进入了死锁状态 数据结构…

实用指南:上下文工程驱动智能体向 “连续性认知”跃迁

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

实用指南:基于STM32单片机的OneNet物联网粉尘烟雾检测系统

实用指南:基于STM32单片机的OneNet物联网粉尘烟雾检测系统pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consol…

青岛专业公司网站设计wordpress自动安装

HTML学习第三天&#xff01; PS&#xff1a;牛牛只是每天花了1.5-2小时左右来学习HTML。 书接上回 HTML<div>和<span> HTML 可以通过<div> 和 <span>将元素组合起来。 HTML 区块元素 大多数 HTML 元素被定义为块级元素或内联元素。 块级元素在浏…

springboot3 mybatis 数据库操控入门与实战

springboot3 mybatis 数据库操控入门与实战pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

青岛网站设计工作室清远哪里有网页设计培训学费

比较器是一个简单的概念-在输入端对两个电压进行比较。输出为高或者低。因此&#xff0c;在转换的过程中为什么存在振荡。 当转换电平缓慢改变的时候&#xff0c;这个现象经常会发生。常常是由于输入信号存在噪声&#xff0c;因此在转换电平附近的轻微波动会引起输出端的振荡。…

解决winform调用wpf窗体时原窗体缩小的问题

在使用winform调用wpf窗体时,原来的winform窗体会缩小,同时分辨率会发生变化,用如下方法来解决这个问题。 方法一、 首先找到winform项目中的Properties ==>AssemblyInfo.cs,打开该文件,在末尾加入如下代码,之…

便宜的seo网站优化排名专业酒店设计网站建设

OTA简介 随着设备系统日新月异&#xff0c;用户如何及时获取系统的更新&#xff0c;体验新版本带来的新的体验&#xff0c;以及提升系统的稳定性和安全性成为了每个厂商都面临的严峻问题。OTA&#xff08;Over the Air&#xff09;提供对设备远程升级的能力。升级子系统对用户…

三明北京网站建设设计网站排名

[react] 怎么在JSX里属性可以被覆盖吗&#xff1f;覆盖的原则是什么&#xff1f; 会被覆盖&#xff0c;类似Object.assign&#xff0c;后面的覆盖前面的 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨…

C# invoke C++ method

1. Platform Invocation (P/Invoke) Set C++ project as dll, compile, copy compiled c++ dll to C# bin/debug matched location //C++ // ConsoleApplication1.cpp : This file contains the main function. Progra…

本土化优势凸显:Gitee如何成为中国开发团队的效率引擎

本土化优势凸显:Gitee如何成为中国开发团队的效率引擎 在全球数字化转型加速的背景下,中国开发者正面临着独特的挑战与机遇。作为国内领先的代码托管平台,Gitee凭借其深度本土化服务和技术合规优势,正在重塑企业级…

Linux系统OOM终止Oracle进程

提供的系统日志截图,这是一次典型的 Linux 系统因内存不足(Out of Memory, OOM)而强制终止进程的事件。系统内核为了保护自身不被完全挂起,选择了终止占用大量内存的 Oracle 数据库进程。 核心问题分析:根本原因:…

实用指南:《C++进阶之C++11》【可变参数模板 + emplace接口 + 新的类功能】

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Filebeat写ElasticSearch故障排查思路(上) - 教程

Filebeat写ElasticSearch故障排查思路(上) - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

告别 “一刀切” 管理!MyEMS 为不同行业定制专属能源优化方案

在能源管理领域,“一刀切” 的粗放式管理曾是行业普遍痛点 —— 统一的节能指标、相同的管控策略,既无法适配不同行业的能源消耗特性,也难以解决企业个性化的能耗难题。随着 “双碳” 目标推进与企业降本需求升级,…