mdnice

一文带你了解和掌握Markdown编辑神器mdnice-CSDN博客

主要流程

1-9步是为了把源码编译成静态文件(带主题),不想做的可以下载编译好的。第10部是创建nginx服务,上传编译好的源码。

  1. 安装nodejsnodejs各个版本,推荐版本14,win10建议选择下载.msi后缀进行安装

  2. 验证是否安装功,cmd命令行输入node -vnpm -v。有输出版本说明安装成功

  3. 修改npm包为国内镜像源;输入命令:npm config set registry https://registry.npmmirror.com

  4. 下载mdnice源码

  5. 命令行切换到mdnice源码根目录

  6. npm install

  7. npm start,访问http://localhost:3000

  8. 添加主题

    1. 创建主题文件localThemeList.json,把localThemeList.json上传到\markdown-nice-master\src\json

    2. 修改\markdown-nice-master\src\component\MenuLeft目录下的Theme.js

      1. 第10行添加

        1
        10   import localThemesData from "../../json/localThemeList.json" 
      2. 添加61行

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        58        remoteThemelist = response.data.data;
        59 } else {
        60 // 否则默认主题
        61 remoteThemelist = localThemesData;
        62 // response = await axios.get(THEME_API());
        63 // if (!response.data.success) {
        64 // throw new Error();
        65 // }
        66 // remoteThemelist = response.data.data.themeList;
        67 }
  9. npm run build

  10. 把编译好的源码上传到服务器nginx网站根目录

改好的Theme.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
import React from "react";
import {Menu, Dropdown} from "antd";
import {observer, inject} from "mobx-react";

import {RIGHT_SYMBOL, TEMPLATE_NUM, MARKDOWN_THEME_ID, THEME_LIST, STYLE, THEME_API, TOKEN} from "../../utils/constant";
import {replaceStyle} from "../../utils/helper";
import TEMPLATE from "../../template/index";
import "./Theme.css";
import axios from "axios";
import localThemesData from "../../json/localThemeList.json"

@inject("content")
@inject("navbar")
@inject("view")
@observer
class Theme extends React.Component {
changeTemplate = (item) => {
const index = parseInt(item.key, 10);
const {themeId, css} = this.props.content.themeList[index];
this.props.navbar.setTemplateNum(index);

// 更新style编辑器
if (themeId === "custom") {
this.props.content.setCustomStyle();
// 切换自定义自动打开css编辑
this.props.view.setStyleEditorOpen(true);
} else {
this.props.content.setStyle(css);
}
};

toggleStyleEditor = () => {
const {isStyleEditorOpen} = this.props.view;
this.props.view.setStyleEditorOpen(!isStyleEditorOpen);
};

subscribeMore = () => {
const w = window.open("about:blank");
w.location.href = "https://preview.mdnice.com/themes";
};

componentDidMount = async () => {
let themeList = null;
try {
const {token} = this.props;
let response;
let remoteThemelist;
if (token) {
// 如果处于登录状态,则读取订阅的主题
response = await axios.get(`https://api.mdnice.com/themes/editor`, {
headers: {
Authorization: `Bearer ${token}`,
},
});
if (!response.data.success) {
throw new Error();
}
remoteThemelist = response.data.data;
} else {
// 否则默认主题
remoteThemelist = localThemesData;
// response = await axios.get(THEME_API());
// if (!response.data.success) {
// throw new Error();
// }
// remoteThemelist = response.data.data.themeList;
}

themeList = [
{themeId: "normal", name: "默认主题", css: TEMPLATE.normal},
...remoteThemelist,
{themeId: "custom", name: "自定义", css: TEMPLATE.custom},
];
this.props.content.setThemeList(themeList);
} catch (err) {
console.error("读取最新主题信息错误");
// 降级方案:使用本地的值
themeList = JSON.parse(window.localStorage.getItem(THEME_LIST));
this.props.content.setThemeList(themeList);
}

const templateNum = parseInt(window.localStorage.getItem(TEMPLATE_NUM), 10);

// 主题样式初始化,属于自定义主题则从localstorage中读数据
let style = "";
if (templateNum === themeList.length - 1) {
style = window.localStorage.getItem(STYLE);
} else {
if (templateNum) {
const {css} = themeList[templateNum];
style = css;
} else {
style = TEMPLATE.normal;
}
}
this.props.content.setStyle(style);
replaceStyle(MARKDOWN_THEME_ID, style);
};

render() {
const {templateNum} = this.props.navbar;
const {themeList} = this.props.content;

const mdMenu = (
<Menu onClick={this.changeTemplate}>
{themeList.map((option, index) => (
<Menu.Item key={index}>
<div id={`nice-menu-theme-${option.themeId}`} className="nice-themeselect-theme-item">
<span>
<span className="nice-themeselect-theme-item-flag">
{templateNum === index && <span>{RIGHT_SYMBOL}</span>}
</span>
<span className="nice-themeselect-theme-item-name">{option.name}</span>
{option.isNew && <span className="nice-themeselect-theme-item-new">new</span>}
</span>
<span className="nice-themeselect-theme-item-author">{option.authorName}</span>
</div>
</Menu.Item>
))}
<Menu.Divider />
<li className="nice-themeselect-menu-item">
<div id="nice-menu-subscribe-more" className="nice-themeselect-theme-item" onClick={this.subscribeMore}>
<span>
<span className="nice-themeselect-theme-item-flag" />
<span className="nice-themeselect-theme-item-name nice-menu-subscribe-more">订阅更多主题</span>
</span>
</div>
</li>
<Menu.Divider />

<li className="nice-themeselect-menu-item">
<div id="nice-menu-view-css" className="nice-themeselect-theme-item" onClick={this.toggleStyleEditor}>
<span>
<span className="nice-themeselect-theme-item-flag">
{this.props.view.isStyleEditorOpen && <span>{RIGHT_SYMBOL}</span>}
</span>
<span className="nice-themeselect-theme-item-name">查看主题 CSS</span>
</span>
</div>
</li>
</Menu>
);
return (
<Dropdown overlay={mdMenu} trigger={["click"]} overlayClassName="nice-overlay">
<a id="nice-menu-theme" className="nice-menu-link" href="#">
主题
</a>
</Dropdown>
);
}
}

export default Theme;

上传源码

把编译好的源码上传到nginx网站根目录。我这里放到hexo部署至云服务器这篇剩下的nginx_sit容器中。

上传

参考资料

已添加主题,docker搭建

【开源项目】私有化部署一个公众号markdown编辑工具

没有添加主题,宝塔搭建

绕开登录限制,私有化部署Markdown转公众号格式神器mdnice教程-腾讯云开发者社区-腾讯云 (tencent.com)