HTML 页面模块化实现方案

将 HTML 页面进行模块化是前端开发中的常见需求,它可以提高代码的可维护性和复用性。针对你提供的这个建筑辅助设计工具集合页面,我们可以采用多种模块化方案,下面我将介绍几种常见的实现方式。

方案一:使用服务器端模板引擎

这是最直接的模块化方式,通过服务器端语言将页面拆分为不同的模板文件,在服务器端进行组装后再返回给浏览器。以下是使用 Node.js 和 Express 框架实现的示例:

项目结构

project/
├── public/
│ ├── css/
│ │ └── styles.css
│ ├── js/
│ │ ├── particles.js
│ │ └── main.js
│ └── img/
├── views/
│ ├── layouts/
│ │ └── default.ejs # 主布局模板
│ ├── partials/
│ │ ├── head.ejs # 头部模板
│ │ ├── navbar.ejs # 导航栏模板
│ │ ├── footer.ejs # 页脚模板
│ │ └── particleCanvas.ejs # 粒子画布模板
│ └── index.ejs # 首页模板
├── app.js # Express应用
└── package.json

模板文件实现

  1. head.ejs (头部模板)
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title><%= title %></title>
<!-- 使用国内CDN源 -->
<link href="/static/bootstrap.min.css" rel="stylesheet">
<link href="/css/styles.css" rel="stylesheet">
</head>
  1. navbar.ejs (导航栏模板)
<nav class="navbar navbar-expand-lg navbar-light">
<a class="navbar-brand" href="http://172.16.1.8:8088/">【华科设计】建筑辅助设计相关工具集合</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNavDropdown">
<ul class="navbar-nav ml-auto">
<li class="nav-item active">
<a class="nav-link" href="http://172.16.1.8:8088/">首页</a>
</li>
<li class="nav-item active">
<a class="nav-link" href="http://172.16.1.3:8888/" target="_blank">企业内网</a>
</li>
<li class="nav-item active">
<a class="nav-link" href="http://172.16.1.8:8088/drupal/node/2" target="_blank">关于我们</a>
</li>
</ul>
</div>
</nav>
  1. particleCanvas.ejs (粒子画布模板)
<canvas id="particle-container"></canvas>
  1. footer.ejs (页脚模板)
<footer class="footer">
<script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
<center>
浏览量:<span id="busuanzi_value_site_pv"><i class="fa fa-spinner fa-spin"></i></span>
</center>
copyright by 华科设计--高治中
</footer>
  1. default.ejs (主布局模板)
<!DOCTYPE html>
<html lang="zh-CN">
<% include partials/head %>
<body>
<% include partials/navbar %>
<% include partials/particleCanvas %> <div class="main-content">
<div class="container mt-3">
<%= body %>
</div>
</div> <% include partials/footer %> <script src="/static/jquery.slim.min.js"></script>
<script src="/static/popper.min.js"></script>
<script src="/static/bootstrap.min.js"></script>
<script src="/js/particles.js"></script>
<script src="/js/main.js"></script>
</body>
</html>
  1. index.ejs (首页内容模板)
<h1 class="text-center page-title">你好,我是建筑辅助设计的AI助手</h1>
<p class="text-center page-subtitle">有关建筑、规范、软件使用等任何问题都可以问我哦~</p> <div class="card-columns">
<div class="card">
<div class="card-body">
<h5 class="card-title"><a href="http://172.16.1.8:8088/chat.html" target="_blank">查规范</a></h5>
<p class="card-text">通过知识库AI训练,查询各专业相关规范</p>
</div>
</div>
<!-- 其他卡片内容... -->
</div>
  1. app.js (Express 应用)
const express = require('express');
const path = require('path');
const app = express(); // 配置视图引擎
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs'); // 静态文件服务
app.use(express.static(path.join(__dirname, 'public'))); // 首页路由
app.get('/', (req, res) => {
res.render('index', {
title: '【华科设计】建筑辅助设计相关工具集合'
});
}); // 启动服务器
const port = process.env.PORT || 3000;
app.listen(port, () => {
console.log(`服务器运行在 http://localhost:${port}`);
});

方案二:使用客户端模板引擎

如果不想使用服务器端技术,也可以在客户端使用模板引擎来实现模块化,以下是使用 Handlebars.js 的示例:

HTML 结构

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>【华科设计】建筑辅助设计相关工具集合</title>
<!-- 使用国内CDN源 -->
<link href="/static/bootstrap.min.css" rel="stylesheet">
<link href="styles.css" rel="stylesheet">
</head>
<body>
<!-- 模板将在这里渲染 -->
<div id="app"></div> <!-- 模板定义 -->
<script id="navbar-template" type="text/x-handlebars-template">
<!-- 导航栏HTML代码 -->
</script> <script id="footer-template" type="text/x-handlebars-template">
<!-- 页脚HTML代码 -->
</script> <script id="main-content-template" type="text/x-handlebars-template">
<!-- 主要内容HTML代码 -->
</script> <script src="https://cdn.jsdelivr.net/npm/handlebars@latest/dist/handlebars.js"></script>
<script src="app.js"></script>
</body>
</html>

JavaScript 实现 (app.js)

// 注册模板
Handlebars.registerTemplate('navbar', document.getElementById('navbar-template').innerHTML);
Handlebars.registerTemplate('footer', document.getElementById('footer-template').innerHTML);
Handlebars.registerTemplate('mainContent', document.getElementById('main-content-template').innerHTML); // 页面数据
const pageData = {
title: '【华科设计】建筑辅助设计相关工具集合',
tools: [
{
title: '查规范',
href: 'http://172.16.1.8:8088/chat.html',
description: '通过知识库AI训练,查询各专业相关规范'
},
// 其他工具数据...
]
}; // 渲染页面
function renderPage() {
const navbarHTML = Handlebars.compile(Handlebars.templates.navbar)(pageData);
const footerHTML = Handlebars.compile(Handlebars.templates.footer)();
const mainContentHTML = Handlebars.compile(Handlebars.templates.mainContent)({ tools: pageData.tools }); document.getElementById('app').innerHTML = `
${navbarHTML}
<canvas id="particle-container"></canvas>
<div class="main-content">
<div class="container mt-3">
${mainContentHTML}
</div>
</div>
${footerHTML}
`; // 初始化粒子效果
initParticles();
} // 粒子效果初始化
function initParticles() {
// 粒子代码...
} // 页面加载完成后渲染
document.addEventListener('DOMContentLoaded', renderPage);

方案三:使用 ES6 模块和 Web Components

对于更现代化的前端项目,可以使用 ES6 模块和 Web Components 来实现组件化:

项目结构

project/
├── public/
│ ├── css/
│ │ └── styles.css
│ ├── js/
│ │ ├── components/
│ │ │ ├── Navbar.js # 导航栏组件
│ │ │ ├── Footer.js # 页脚组件
│ │ │ ├── ToolCard.js # 工具卡片组件
│ │ │ └── ParticleCanvas.js # 粒子画布组件
│ │ └── main.js # 主应用
│ └── img/
└── index.html # 入口HTML

组件实现示例

  1. Navbar.js (导航栏组件)
class Navbar extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
} connectedCallback() {
this.render();
} render() {
this.shadowRoot.innerHTML = `
<style>
/* 导航栏样式 */
.navbar {
background-color: white;
padding: 10px 15px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
z-index: 1000;
}
/* 其他样式... */
</style>
<nav class="navbar navbar-expand-lg navbar-light">
<a class="navbar-brand" href="http://172.16.1.8:8088/">【华科设计】建筑辅助设计相关工具集合</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNavDropdown">
<ul class="navbar-nav ml-auto">
<li class="nav-item active">
<a class="nav-link" href="http://172.16.1.8:8088/">首页</a>
</li>
<!-- 其他导航项... -->
</ul>
</div>
</nav>
`;
}
} customElements.define('nav-bar', Navbar);
  1. main.js (主应用)
import './components/Navbar.js';
import './components/Footer.js';
import './components/ParticleCanvas.js';
import './components/ToolCard.js'; document.addEventListener('DOMContentLoaded', () => {
const app = document.getElementById('app'); // 添加导航栏组件
const navbar = document.createElement('nav-bar');
app.appendChild(navbar); // 添加粒子画布组件
const particleCanvas = document.createElement('particle-canvas');
app.appendChild(particleCanvas); // 添加主要内容
const mainContent = document.createElement('div');
mainContent.className = 'main-content';
mainContent.innerHTML = `
<div class="container mt-3">
<h1 class="text-center page-title">你好,我是建筑辅助设计的AI助手</h1>
<p class="text-center page-subtitle">有关建筑、规范、软件使用等任何问题都可以问我哦~</p> <div class="card-columns">
${createToolCards()}
</div>
</div>
`;
app.appendChild(mainContent); // 添加页脚组件
const footer = document.createElement('page-footer');
app.appendChild(footer);
}); function createToolCards() {
const tools = [
{ title: '查规范', href: 'http://172.16.1.8:8088/chat.html', description: '通过知识库AI训练,查询各专业相关规范' },
// 其他工具...
]; return tools.map(tool => `
<tool-card title="${tool.title}" href="${tool.href}" description="${tool.description}"></tool-card>
`).join('');
}

选择合适的模块化方案

三种方案各有优缺点,你可以根据项目需求选择:

  1. 服务器端模板引擎

    • 优点:SEO 友好,减轻客户端负担,适合需要后端支持的项目
    • 适合场景:企业内部系统、需要与数据库交互的应用
  2. 客户端模板引擎
    • 优点:纯前端实现,不需要服务器端支持
    • 适合场景:小型项目、原型开发
  3. ES6 模块和 Web Components
    • 优点:最现代化的组件化方案,符合 Web 标准,便于维护和扩展
    • 适合场景:大型前端项目、需要高度可复用组件的应用

无论选择哪种方案,模块化的核心思想都是将页面拆分为独立可复用的组件,每个组件负责自己的逻辑和样式,从而提高代码的可维护性和开发效率。


SSI 配置问题排查

当按照上述步骤配置后无法显示内容,通常是由于 SSI 配置不正确或未完全生效导致的。下面我将提供详细的排查步骤和解决方案:

一、检查 XAMPP 配置

1. 确认 mod_include 模块已启用

打开httpd.conf文件,确保以下行没有被注释(即没有#前缀):

LoadModule include_module modules/mod_include.so

2. 确认 Directory 选项配置正确

找到并修改 htdocs 目录配置,确保包含Includes选项:

<Directory "C:/xampp/htdocs">
Options Indexes FollowSymLinks Includes
AllowOverride All
Require all granted
</Directory>

3. 确认 SSI 文件扩展名配置

确保添加了以下配置(如果没有则添加):

AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

4. 重启 Apache 服务器

修改配置文件后,必须重启 Apache 服务器使更改生效。

二、检查文件结构和权限

1. 确认文件路径和命名

确保文件结构如下:

htdocs/
├── includes/
│ ├── head.html
│ ├── navbar.html
│ ├── footer.html
│ └── particleCanvas.html
├── css/
│ └── styles.css
├── js/
│ └── particles.js
└── index.shtml

2. 确认文件权限

确保所有文件都有读取权限,特别是在 Linux 或 macOS 环境下。

三、调试方法

1. 创建测试文件

创建一个简单的测试文件test.shtml

<!DOCTYPE html>
<html>
<body> <h1>SSI测试</h1> 当前时间:<!--#echo var="DATE_LOCAL" --> </body>
</html>

如果这个文件能够显示当前时间,则表示 SSI 配置正常。

2. 检查 Apache 错误日志

查看 XAMPP 的 Apache 错误日志文件xampp/apache/logs/error.log,查找与 SSI 相关的错误信息。

常见错误包括:

  • [includes:error] [pid ...] [client ...] AH01240: failed to open... - 表示包含文件路径错误
  • [includes:error] [pid ...] [client ...] mod_include: Options +Includes not enabled - 表示 Directory 选项配置错误

3. 使用浏览器开发者工具

在浏览器中打开开发者工具(F12 或右键检查),查看 Network 面板:

  • 检查 index.shtml 的响应内容
  • 检查是否有 404 或 500 错误
  • 查看控制台是否有 JavaScript 错误

四、替代解决方案

如果上述方法仍然无法解决问题,可以考虑使用以下替代方案:

1. 使用 PHP include 语句

虽然你希望避免使用 PHP,但这是最简单的解决方案:

<!DOCTYPE html>
<html lang="zh-CN">
<?php include 'includes/head.html'; ?>
<body>
<?php include 'includes/navbar.html'; ?> <?php include 'includes/particleCanvas.html'; ?> <div class="main-content">
<!-- 页面内容 -->
</div> <?php include 'includes/footer.html'; ?> <script src="https://cdn.staticfile.org/jquery/3.5.1/jquery.slim.min.js"></script>
<script src="https://cdn.staticfile.org/popper.js/1.16.1/umd/popper.min.js"></script>
<script src="https://cdn.staticfile.org/twitter-bootstrap/4.6.0/js/bootstrap.min.js"></script>
<script src="/js/particles.js"></script>
</body>
</html>

将文件扩展名改为.php,并确保 XAMPP 的 PHP 模块已启用。

2. 使用 JavaScript 动态加载

如果不想使用服务器端技术,可以使用 JavaScript 动态加载:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>【华科设计】建筑辅助设计相关工具集合</title>
<link href="https://cdn.staticfile.org/twitter-bootstrap/4.6.0/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div id="navbar-container"></div> <div class="main-content">
<!-- 页面内容 -->
</div> <div id="footer-container"></div> <script>
// 加载导航栏
fetch('includes/navbar.html')
.then(response => response.text())
.then(data => {
document.getElementById('navbar-container').innerHTML = data;
}); // 加载页脚
fetch('includes/footer.html')
.then(response => response.text())
.then(data => {
document.getElementById('footer-container').innerHTML = data;
});
</script>
</body>
</html>

五、最终建议

  1. 首先尝试创建测试文件test.shtml,确认 SSI 是否正常工作
  2. 如果测试文件无法显示当前时间,请仔细检查 Apache 配置和错误日志
  3. 如果测试文件正常但主页面仍无法显示,请检查包含文件的路径和内容
  4. 如果仍然无法解决,考虑使用 PHP include 作为替代方案,这是最可靠的方法

通过以上步骤,应该能够找出问题所在并解决 SSI 无法正常工作的问题。


SSI 测试失败的深度排查

当 SSI 测试页面无法显示时间,且错误日志中没有相关记录时,说明 SSI 功能可能未正确启用。下面我将提供更详细的排查步骤和解决方案:

一、重新检查 Apache 配置

1. 确认 mod_include 模块加载

httpd.conf中找到以下行,确保没有被注释:

LoadModule include_module modules/mod_include.so

2. 启用 SSI 的正确方式

修改 Directory 配置,确保包含Options +Includes

<Directory "C:/xampp/htdocs">
Options Indexes FollowSymLinks +Includes
AllowOverride All
Require all granted
</Directory>

3. 配置 AddType 和 AddOutputFilter

确保以下配置存在

AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

4. 检查是否有其他配置覆盖

搜索整个httpd.conf文件,确保没有其他地方的配置覆盖了上述设置。

二、启用详细日志记录

httpd.conf中添加以下行,启用更详细的 SSI 日志记录:

LogLevel includes:trace3

重启 Apache 后,再次测试 SSI 页面,然后检查error.log文件,应该能看到更详细的 SSI 处理信息。

三、检查文件权限和路径

1. 文件权限

确保所有相关文件都有可读权限:

htdocs/
├── includes/
│ ├── head.html
│ ├── navbar.html
│ ├── footer.html
│ └── particleCanvas.html
├── test.shtml
└── index.shtml

2. 测试文件路径

创建一个简单的测试文件结构:

<!-- test.shtml -->
<!DOCTYPE html>
<html>
<body> <h1>SSI测试</h1> 当前时间:<!--#echo var="DATE_LOCAL" --> 包含测试:<!--#include virtual="includes/navbar.html" --> </body>
</html>

确保includes/navbar.html存在且内容正确。

四、验证服务器响应

使用浏览器开发者工具或 curl 检查服务器响应:

curl -v http://localhost/test.shtml

查看响应头和内容,确认:

  1. 响应状态码是否为 200
  2. 响应内容是否包含 SSI 指令(如果包含,说明 SSI 未被处理)
  3. 响应头中是否有X-Powered-By: PHP/...(如果有,可能 PHP 配置有冲突)

五、临时修改配置测试

1. 临时修改 Directory 配置

尝试将 Directory 配置修改为最宽松的设置:

<Directory "C:/xampp/htdocs">
Options All
AllowOverride All
Require all granted
</Directory>

重启 Apache 后测试,这将启用所有服务器功能,帮助确认是否是某个选项被禁用导致的问题。

2. 临时修改文件扩展名

尝试将测试文件改为.html扩展名,并修改配置:

AddType text/html .html
AddOutputFilter INCLUDES .html

重启 Apache 后测试test.html,确认是否是扩展名配置问题。

六、替代解决方案

如果上述方法仍然无法解决问题,建议使用 PHP include 替代 SSI:

1. 创建测试 PHP 文件

<!-- test.php -->
<!DOCTYPE html>
<html>
<body> <h1>PHP测试</h1> 当前时间:<?php echo date('Y-m-d H:i:s'); ?> 包含测试:<?php include 'includes/navbar.html'; ?> </body>
</html>

2. 确认 PHP 工作正常

确保 XAMPP 的 PHP 模块已启用,访问http://localhost/test.php,如果能正常显示时间和包含内容,则说明 PHP 工作正常。

3. 转换项目到 PHP

将所有.shtml文件改为.php,并将 SSI 指令替换为 PHP include:

<?php include 'includes/head.html'; ?>

七、最终建议

  1. 如果 SSI 仍然无法工作,建议使用 PHP include 作为替代方案,这是最可靠的方法
  2. 如果需要坚持使用 SSI,建议重新安装 XAMPP,确保在安装过程中选择了所有组件
  3. 考虑使用其他 Web 服务器(如 Nginx+FastCGI),虽然配置更复杂,但可能避免 XAMPP 的一些配置问题

通过以上步骤,应该能够找出 SSI 无法正常工作的原因并解决问题。

模块化html代码的更多相关文章

  1. formidable 模块化开发 代码拆分(解耦) nodejs图片服务器架构

    引言:程序要做到:健壮性.低耦合.可扩展.方便程序员分工合作 上传图片值nodejs服务器并显示图片的源代码: post.html : <!DOCTYPE html> <html l ...

  2. entfrm开源免费模块化无代码开发平台,开放生态为您创造更多的价值

    entfrm开发平台6大特性,赋能快速开发,为您创造更多的价值: 1. 模块化 丰富的模块稳定的框架 后台极易上手 目前已包括系统管理.任务调度.运维监控.开发工具.消息系统.工作流引擎.内容管理等模 ...

  3. entfrm-boot开发平台一览【entfrm开源模块化无代码开发平台】

    介绍 entfrm-boot是一个以模块化为核心的无代码开发平台,能够让中小企业快速从零搭建自己的开发平台:开箱即用,可插拔可自由组合:以模块化的方式,最大化的代码复用,避免重复开发:无代码可视化开发 ...

  4. [H5-Compress-Image]利用canvas实现 javascript 图片压缩处理_基于requirejs模块化的代码实现

    // 还存在有问题的代码,问题在于processFile()中// 问题:在ipone 5c 下,某些图片压缩处理后,上传到服务器生成的文件size为0,即是空白 ;define(['mod/tool ...

  5. entfrm-boot开发平台功能介绍【entfrm开源模块化无代码开发平台】

    简介 entfrm开发平台,是一个以模块化为核心的无代码开发平台,是一个集PC和APP快速开发.系统管理.运维监控.开发工具.OAuth2授权.可视化数据源管理与数据构建.API动态生成与统计.工作流 ...

  6. 模块化Javascript代码的两种方式

    1.将模块整体放在函数里 function buildMonthNameModule() { var names = ["January ", "February&quo ...

  7. js模块化历程

    这是一篇关于js模块化历程的长长的流水账,记录js模块化思想的诞生与变迁,展望ES6模块化标准的未来.经历过这段历史的人或许会感到沧桑,没经历过的人也应该知道这段历史. 无模块时代 在ajax还未提出 ...

  8. 模块化利器: 一篇文章掌握RequireJS常用知识

    通过本文,你可以对模块化开发和AMD规范有一个较直观的认识,并详细地学习RequireJS这个模块化开发工具的常见用法.本文采取循序渐进的方式,从理论到实践,从RequireJS官方API文档中,总结 ...

  9. js 模块化历程

    作者:吕大豹 网址:http://www.cnblogs.com/lvdabao/p/js-modules-develop.html 这是一篇关于js模块化历程的长长的流水账,记录js模块化思想的诞生 ...

  10. javascript模块化应用

    这是一篇关于js模块化历程的长长的流水账,记录js模块化思想的诞生与变迁,展望ES6模块化标准的未来.经历过这段历史的人或许会感到沧桑,没经历过的人也应该知道这段历史. 无模块时代 在ajax还未提出 ...

随机推荐

  1. sonarqube+gitlab+jenkins+maven集成搭建 (五)

    Jenkins与SonarQube Jenkins 配置 SonarQube在 SonarQube 中生成 Server authentication token登录 SonarQube 后,在 &q ...

  2. 2K star!三分钟搭建企业级后台系统,这款开源Java框架绝了!

    2K star!三分钟搭建企业级后台系统,这款开源Java框架绝了! "LikeAdmin Java是基于Spring Boot + Mybatis Plus + Vue 3的快速开发平台, ...

  3. 最强AI数字人,口型、表情、动作全同步!Kairos下载介绍

    在数字化浪潮汹涌澎湃的今天,视频合成技术如同一颗璀璨的明星,照亮了内容创作的广阔天地 Kairos是一款顶级数字人制作工具,它基于先进的 AI 算法,能够快速克隆出用户的数字分身,并且精准匹配外貌.声 ...

  4. 通用的servlet

    1 通用的servlet实现的原理 2 实例 2.1 目录结构 2.2 BaseServlet.java 2.3 ServletDemo.java 2.4 index.html 2.5 test.ht ...

  5. GDB调试Core文件出现问号?的原因

    函数的调用其实是函数的入栈出栈操作,但当程序栈因程序的错误导致破坏了栈,这时候就会导致gdb解析core文件时解析不出来的情况,即是问号(?) 那还能做点什么呢? 可以通过打印\(rbp\)和\(rs ...

  6. 结合pandas,sqlite3批量将csv数据导入sqlite数据库

    import sqlite3 import pandas as pd conn=sqlite3.connect(r'demo.db') c=conn.cursor() 创建新表 c.execute(& ...

  7. 会用 AI 的工程师,效率已经拉开差距了 - “ 我们曾经引以为傲的编码能力,正在被改写。”

    最近尝试用Cursor做了几个内部业务系统,发现一个越来越明显的趋势 真正会用 AI 的工程师,效率已经拉开差距了. 做了十几年 Java, 这波 AI 编程浪潮来得快,一开始我也没太当回事,以为这波 ...

  8. 航空货运系统总结性Blog

    前言 本次题目集以航空运送货物为背景,设计航空货物管理系统,主要考察对类设计的把握是否合理还有对继承和多态的使用,能否设计出符合标准的类,是否充分理解对面向对象六大设计原则(SRP,OCP,LSP,D ...

  9. WPF 的 await Application.Current.Dispatcher.InvokeAsync,Func 如果是Task , 等待赋值可能存在没有等待执行完成的问题

    最近在检查我们组内的代码,发现好多用到 await Application.Current.Dispatcher.InvokeAsync 相信好多WPF的开发都会用到 该方法做UI线程切换.但是细看里 ...

  10. 聊一聊 .NET Dump 中的 Linux信号机制

    一:背景 1. 讲故事 当 .NET程序 在Linux上崩溃时,我们可以配置一些参考拿到对应程序的core文件,拿到core文件后用windbg打开,往往会看到这样的一句信息 Signal SIGAB ...