mdnice
一文带你了解和掌握Markdown编辑神器mdnice-CSDN博客
主要流程
1-9步是为了把源码编译成静态文件(带主题),不想做的可以下载编译好的。第10部是创建nginx服务,上传编译好的源码。
安装nodejsnodejs各个版本,推荐版本14,win10建议选择下载.msi
后缀进行安装
验证是否安装功,cmd命令行输入node -v
和npm -v
。有输出版本说明安装成功
修改npm包为国内镜像源;输入命令:npm config set registry https://registry.npmmirror.com
下载mdnice源码
命令行切换到mdnice源码根目录
npm install
npm start,访问http://localhost:3000
添加主题
创建主题文件localThemeList.json,把localThemeList.json
上传到\markdown-nice-master\src\json
修改\markdown-nice-master\src\component\MenuLeft
目录下的Theme.js
第10行添加
1
| 10 import localThemesData from "../../json/localThemeList.json"
|
添加61行
1 2 3 4 5 6 7 8 9 10
| 58 remoteThemelist = response.data.data; 59 } else { 60 61 remoteThemelist = localThemesData; 62 63 64 65 66 67 }
|
npm run build
把编译好的源码上传到服务器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);
if (themeId === "custom") { this.props.content.setCustomStyle(); 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; }
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);
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)