初学Node.js之Markdown建站

news/2024/5/17 10:15:45/文章来源:https://blog.csdn.net/weixin_34055910/article/details/89862878

 平时做项目中的Web应用都是用Asp.Net或者Java,但有时候需要快速做一些小Web的时候,感觉用Asp.Net或者Java都有点重。一开始想学学PHP,但实在不喜欢PHP的语法,所只用PHP写了两个简单的Demo之后就写不下去了。了解到最近Node.js有点热,前景也不错,而且JavaScript平时也都在用,所以决定学习下Node.js。


  准备入门,习惯做两件事,一件是在Google上搜索相关的入门教程,参考等;二是去官方网站找找Guide或者Manual。最后花了一两天浏览了些资料,这两个够了:


  • Node.js入门>>一本全面的Node.js教程

  • Node.js概述(by 阮一峰)


  当然还有其它一些资料,比如博客、论坛之类。不过官方网站上只找到API文档,适合参考不适合入门。所有这些资料主要是浏览一遍,认识下Node.js,然后还是要在实践中学习。

  官方下载,安装都很顺利。不过虽然安装时修改了PATH,但是安装好之后命令行不能直接运行“node”,想起Windows有个老毛病——经常安装程序修改了PATH之后不会生效,所以自己又去系统环境变量设置里重新配置了一下PATH,node命令就可用了。


  “Helloworld”还是很简单的,把各种教程上的示例都试了下,然后准备写个小Web。Web Helloworld也很简单,不过要想写功能完整的Web,还是得花些精神,所以还是找框架吧。Google出来Express评价不错,也比较主流,所以决定用Express。仍然是Google+官方文档,这两个资料都不错:


  • 官方的 Express Guide

  • 中文翻译的 Express 新手指南


  简单实践之后准备构思自己的第一个Node.js Web应用。因为懒得写HTML,最近又正好经常写Markdown的文档,所以准备用Markdown来建个站。Markdown解析当然想自己写,所以仍然是老办法,Google。Node.js的Markdown包找到两个,都是Github上:


  • https://github.com/evilstreak/markdown-js

  • https://github.com/andris9/node-markdown


  也不知道哪个好,所以随便选一个,就选了第一个。当然在建站之前还是需要实验下的,基本满足要求,能支持标准的Markdown语法,但有一些小BUG。因为这次目的是熟悉Node.js和Express,所以不纠结这个问题了,以后有空再找更好的Markdown解析包,实在找不到自己写个也不是很麻烦的事情。


  一切准备就绪,开始建站,这里记录下建站的详细过程,一步步说明,入门级的。老实说我比较懒,不想自己去准备Express的结构,所以用了传说中最好的Node.js IDE - JetBrain WebStrom。WebStorm新建项目时有“Node.js Express App”模板


wKiom1MkEJ_iVx_iAAE84auSzqQ395.jpg


  然后在Node.js Express App的选项中,选择使用EJS模板引擎和LESS样式引擎。虽然很多人推荐Jade模板引擎,但是这是个新语法,而且也是我不喜欢的那种。还是EJS更贴近ASP和JSP的语法,所以选择它了。至于LESS,写起来肯定要比直接写CSS轻松得多,这个早就有经验了。


  Express应用信息和依赖包在package.json中配置。先得把markdown加进来,所以修改WebStorm生成的package.json:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
    "name""application-name",
    "version""0.0.1",
    "private"true,
    "scripts": {
        "start""node app.js"
    },
    "dependencies": {
        "express""3.5.0",
        "ejs""*",
        "less-middleware""*",
        "markdown""*"
    }
}


  最后那句 "markdown": "*" 就是新加的内容。package.json是JSON格式,需要使用双引号把属性名和字符串值包起来。虽然Node.js规范推荐大家在编程时使用单引号表示字符串,但这里,单引号是不行的。


  Express App的入口是app.js,这个也在package.json中配置:"start""node app.js"。WebStorm生成的app.js中是通过3000端口监听服务,因为我的机器上没有安装Web服务器,80端口空着,所以我把端口号改成了80。然后,看app.js的源码,在启动HTTP服务之前配置了两行URL Route。考虑到以后的应用中URL路由配置可能会很长,再加上我有点洁癖,所以我决定尝试把URL路由放在一个独立的脚本中配置,于是在根目录下创建了一个app-routes.js,专们用来配置路由:


1
2
3
4
5
6
var routes = require('./routes');
var user = require('./routes/user');
exports.route = function (app) {
    app.get('/', routes.index);
    app.get('/users', user.list);
};


  然后在app.js中引入app-routes,并调用导出的route方法,顺便把上面没用的require都删了:


1
2
3
// app.get('/', routes.index);
// app.get('/users', user.list);
require('./app-routes').route(app);


  运行了下,效果不错,路由没问题。剩下的就是解析Markdown的问题了。Markdown文件我准备专门建个目录来保存,所有文件都用其它编辑器(比如Sublime Text)写好放在里面,然后通过在url中直接输入“/文件名”的方式来打开解析后的HTML页面。


  然后在routes目录下添加了一个markdown.js,这个脚本根据URL参数,在md目录下选择对应的文件,解析后,通过views目录下新添加的md.ejs模板显示成HTML,所以目录结构就像这个


wKioL1MkEHiBxrYwAADqw3rRoqk097.jpg


  接着添加路由,将访问请求交给markdown.js来处理


1
2
3
4
5
var routes = require('./routes');
var markdown = require('./routes/markdown');
exports.route = function (app) {
    app.get('/(:md)?', markdown.show);
};


  还有md.ejs模板,需要在<body>标准中显示由Markdown文件转换而来的HTML,所以使用<%- %>标记。


1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css'/>
</head>
<body>
<%- content %>
</body>
</html>


  markdown.js中的处理过程是获取路由参数,再根据参数在md目录下去找对应的文件,如果没找到直接返回404错误。如果找到了就将这个文件的内容读出来,解析成HTML,传递给md.ejs输出到浏览器。同时考虑如果URL不带参数,则说明是访问首页,markdown.js应该直接去解析md/index.md。


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
var fs = require("fs");
var path = require("path");
var markdown = require("markdown").markdown;
exports.show = function (req, res) {
    // 获取参数并将参数转换成
    var mdName = req.params.md || "index";
    if (!mdName.match(/\.md$/i)) {
        mdName += ".md";
    }
    // 根据当前目录和相对目录找到参数对应的md文件
    var filename = path.resolve(path.join(__dirname, "../md", mdName));
    // render函数定义符合readFile和callback标准
    // 如果md文件读取错误或者没有内容,向浏览器返回404
    // 有内容则调用md.ejs渲染HTML页面
    var render = function (err, md) {
        if (err || !md) {
            res.status(404).send("Error");
            return;
        }
        var html = markdown.toHTML(md);
        res.render("md", {
            title: "Markdown Content",
            content: html
        });
    };
    // 从md文件读取内容,并将读到的内容交能render函数处理
    fs.readFile(filename, { encoding: "utf8" }, render);
};



  完工,使用node app.js启动服务,再在浏览器中访问,一切正常,只是——页面太丑了,因为没加样式。修改public/stylesheets/style.less,加入样式


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
body {
    margin24px;
    font14px "微软雅黑""Lucida Grande"HelveticaArialsans-serif;
}
.h {
    font-weightnormal;
}
h1 {
    .h();
    font-size32px;
}
h2 {
    .h();
    font-size24px;
}
h3 {
    .h();
    font-size18px;
}
.quote {
    background-color#e8e8e8;
    border-left5px solid #cacaca;
    padding3px 0 3px 24px;
    border-radius: 3px;
    margin0;
    p {
        margin1px 0;
    }
}
code {
    .quote();
    font-family: Consolas, Monaco, "Lucida Console"monospace;
    padding0 5px;
    margin-left2px;
    margin-right2px;
    border1px solid #cacaca;
}
pre {
    .quote();
    border-left-width32px;
    padding-left12px;
    code {
        border0;
        padding0;
        margin0;
    }
}
blockquote {
    .quote();
    code {
        background-color#f8f8f8;
    }
}
a {
    color#666;
    text-decorationunderline;
    &:visited {
        color#999;
    }
    &:hover {
        color#000;
    }
}
ul, ol {
    margin0;
    padding0;
    li {
        margin-left1.2em;
        padding0;
    }
}
ul li {
    list-style-typesquare;
}
hr {
    height1px;
    border0;
    background-color#999;
}


  这回才是真正的完工了,看看效果:


wKioL1MkEHnSGqJvAAL_f5pnYvk875.jpg


本文转自边城__ 51CTO博客,原文链接:http://blog.51cto.com/jamesfancy/1377256,如需转载请自行联系原作者

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

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

相关文章

自己搭建CA颁发证书做https加密网站

如果网站是针对内网的访问的&#xff0c;自己搭建CA服务器颁发证书就可以&#xff0c;如果是针对互联网来访问的&#xff0c;还是买ssl证书比较好&#xff0c;今天就来介绍一下自己搭建CA服务器颁发证书做加密网站。 192.168.10.187 CA服务器 192.168.10.190 web服务器 &#x…

完整利用Rsync实现服务器/网站数据增量同步备份

我们在选择VPS、服务器架设项目之后&#xff0c;所有的项目、网站数据都需要我们自行备份和维护&#xff0c;即便有些服务商有提供管理型服务器&#xff0c;但是数据自行备份和管理才是较为靠谱的。无论是网站&#xff0c;还是其他项目&#xff0c;数据的备份方式有很多种&…

MVC与单元测试实践之健身网站(一)-项目概述

2019独角兽企业重金招聘Python工程师标准>>> 前不久刚刚通过租房网站的开发学习了MVC&#xff0c;并随后学习了单元测试相关的基础&#xff0c;现在开始健身网站的开发&#xff0c;该项目将结合MVC与单元测试&#xff0c;在开发实践过程中&#xff0c;趁热打铁&…

Java爬虫_资源网站爬取实战

对 http://bestcbooks.com/ 这个网站的书籍进行爬取 (爬取资源分享在结尾) 下面是通过一个URL获得其对应网页源码的方法 传入一个 url 返回其源码 (获得源码后&#xff0c;对源码进行解析&#xff0c;获得页面中其他的书籍地址和当前页面的书籍的百度网盘的链接,因为这个网站…

Nginx配置SSL证书部署HTTPS网站

一、什么是 SSL 证书&#xff0c;什么是 HTTPSSSL 证书是一种数字证书&#xff0c;它使用 Secure Socket Layer 协议在浏览器和 Web 服务器之间建立一条安全通道&#xff0c;从而实现&#xff1a;1、数据信息在客户端和服务器之间的加密传输&#xff0c;保证双方传递信息的安全…

【好书试读】速度与激情:以网站性能提升用户体验

开始试读&#xff1a;https://yqfile.alicdn.com/1d4578a32e3f5120cd35a1e53e2000b5.pdf天猫购买链接&#xff1a;速度与激情&#xff1a;以网站性能提升用户体验 Web设计师在权衡外观设计与网站性能时总是要作出艰难的选择。良好的内容、布局、图片和交互对于吸引用户来说至关…

网站用户身份识别俩大招之django实现cookie

导航&#xff1a; 原理介绍 代码实现 过程分析 追踪Cookie 原理介绍 众所周知&#xff0c;http协议是无状态的协议&#xff0c;简单理解是用户的前一步操作和后一步操作之间没有关系&#xff0c;互相不知道&#xff0c;不干扰。而在很多场景下&#xff0c;浏览网页时&#xff0…

Java网站开发必看书籍

转发&#xff1a;https://blog.csdn.net/tianya846/article/details/50683248 1&#xff1a;《java并发编程从入门到精通》 推荐理由&#xff1a; 从入门讲到精通的&#xff0c;网络安全&#xff0c;网络并发的好书。《Java并发编程从入门到精通》作者结合自己10多年Java并发编…

记在VMware虚拟机中对网站进行性能压力测试的经历

由于本次测试&#xff0c;仅仅是对静态网站首页进行的测试&#xff0c;所以没有涉及到MySQL数据库的性能监测 服务器基本配置 webbench测试工具 Linux上一款优秀的web性能压力测试工具。webbench最多可以模拟3万个并发连接去测试网站的负载能力。 下面开始测试 第一次并发测试 …

基于keepalived实现多种模式的高可用集群网站架构

一、 实现主从服务器高可用技术。 大概网络拓扑图&#xff1a; 前提准备条件&#xff1a; 准备四台机器&#xff0c;一台为keepalived的master&#xff0c;一台为keepalived的backup&#xff0c;一台为rs1&#xff0c;一台为rs2&#xff0c;同时都关闭防火墙和selinux。 ①安装…

基于django的视频点播网站开发-step8-后台登录功能

从本讲起&#xff0c;我们会介绍后台管理系统的开发&#xff0c;后台管理&#xff0c;主要是对数据库中的数据进行增、删、改、查的操作&#xff0c;满足网站管理员对网站的管理与维护的需求。 其实&#xff0c;django自带的也有一个后台管理系统&#xff08;/admin&#xff09…

阿里P9架构师简述从单机至亿级流量大型网站系统架构的演进过程

阶段一、单机构建网站网站的初期&#xff0c;我们经常会在单机上跑我们所有的程序和软件。此时我们使用一个容器&#xff0c;如tomcat、jetty、jboos&#xff0c;然后直接使用JSP/servlet技术&#xff0c;或者使用一些开源的框架如mavenspringstructhibernate、mavenspringspri…

SEO新手网站优化工作操作流程汇总

SEO是一个系统的过程&#xff0c;如果你对SEO概念没有很了解&#xff0c;是很难操作的。我们列出有关SEO网站优化操作流程。 以下是网站优化SEO新手操作流程汇总 一、网站诊断 1、网站历史&#xff1a;域名注册时间、域名到期时间、域名注册机构、域名注册人 2、服务器数据&…

个人网站如何使用支付宝收款实现

想给个人网站增加一个支付&#xff0c; 找到https://neue.v2ex.com/t/350564&#xff0c; 按照里面大家讨论的&#xff0c;还真的可以了。 1.开通功能 https://neue.v2ex.com/t/326701 有个商家二维码 图中二维码是服务商的员工码&#xff0c;作为推广的服务商肯定是会有返利…

php 易宝支付,网站接入易宝支付遇上的问题

因为工作的需要&#xff0c;就接触了易宝支付。本以为根据易宝支付提供的demo跟文档就能快速的完成接入工作&#xff0c;可是这一过程并不顺利&#xff0c;耽误了不少时间&#xff0c;所以我就把遇上的问题给记录下来&#xff0c;也许能帮到更多朋友。1)文档选择存在两份文档&a…

获取http://www.89ip.cn/index_1.html网站的ip和端口的组合

2019独角兽企业重金招聘Python工程师标准>>> import requests import re html requests.get("http://www.89ip.cn/index_1.html") okhtml.text ok.replace( ,) ok.replace(\t,) print(ok) pattern2 re.compile((\d.\d.\d.\d).*?(\d),re.S) p1 re.find…

美国视频网站Hulu将开发VR喜剧和新闻内容

Hulu联手RYOT工作室&#xff0c;在VR应用中增加原创喜剧和新闻内容。 美国视频网站Hulu正在和赫芬顿邮报旗下的RYOT工作室合作&#xff0c;准备打造一档VR喜剧节目和新闻内容。 RYOT工作室是在今年四月份被美国在线收购的&#xff0c;成为赫芬顿邮报&#xff08;属于美国在线&…

Node.js爬取科技新闻网站cnBeta(附前端及服务端源码)

前言 一直很喜欢看科技新闻&#xff0c;多年来一直混迹于cnBeta&#xff0c;以前西贝的评论区是匿名的&#xff0c;所以评论区非常活跃&#xff0c;各种喷子和段子&#xff0c;不过也确实很欢乐&#xff0c;可以说那是西贝人气最旺的时候。然而自从去年网信办出台了《互联网跟帖…

服务器安装centos7找不到u盘,安装centos7时找不到u盘怎么办_网站服务器运行维护,centos7,U盘...

虚拟机安装centos7时提示找不到硬盘_网站服务器运行维护虚拟机安装centos7时提示找不到硬盘的解决方法是&#xff1a;1、关闭虚拟机&#xff0c;移除硬盘&#xff1b;2、添加新硬盘&#xff0c;硬盘类型选择IDE&#xff1b;3、设置虚拟硬盘的大小&#xff0c;并创建虚拟硬盘文件…

大型网站架构演变和知识体系 (转)

之前也有一些介绍大型网站架构演变的文章&#xff0c;例如LiveJournal的、ebay的&#xff0c;都是非常值得参考的&#xff0c;不过感觉他们讲的更多的是每次演变的结果&#xff0c;而没有很详细的讲为什么需要做这样的演变&#xff0c;再加上近来感觉有不少同学都很难明白为什么…