javascript - 大晚上的问大伙个Markdown & highlight的问题
PHPz
PHPz 2017-04-10 15:36:38
[JavaScript讨论组]

最近做了一个markdown的个人博客,基于node+express的,前端模版基于ejs,开始是将原始markdown返到页面的标签里,然后用 https://github.com/chjj/marked 解析的,高亮用的highlight官网的js,在html中是这么调用的:

jsmarked.setOptions({
    renderer: new marked.Renderer(),
    gfm: true,
    tables: true,
    breaks: true,
    pedantic: false,
    sanitize: false,
    smartLists: false,
    smartypants: false,
    highlight: function (code) {
      return hljs.highlightAuto(code).value;
    }
  });


var article = $('#article').val();
$('.article').html(marked(article));

上边的代码时可行的。

现在我想直接在node里将markdown解析成html,是这么写的,

jsvar marked = require('marked'),
    hljs = require('../public/js/highlight/highlight.pack.js');

marked.setOptions({
  renderer: new marked.Renderer(),
  gfm: true,
  tables: true,
  breaks: true,
  pedantic: false,
  sanitize: false,
  smartLists: false,
  smartypants: false,
  highlight: function (code) {
    return hljs.highlightAuto(code).value;
  }
});
...

router.get('/a/:id', function (req, res) {
  Post.getOne(req.params.id, function (err, post) {
    if (err) {
      req.flash('error', err); 
      return res.redirect('/');
    }
    res.render('article', {
      title: post.title,
      curIndex: 0,
      article: marked(post.post),
      post: post,
      user: req.session.user,
      success: req.flash('success').toString(),
      error: req.flash('error').toString()
    });
  });
});

但是提示 undefined is not a function,望高人指点,谢谢

PHPz
PHPz

学习是最好的投资!

全部回复(4)
PHP中文网

虽然 highlight 官方说 highlight 兼容 nodejs,但始终没找到相关应用的文档……

ringa_lee

时隔一年啊。。。
好吧,我也是遇到这样的问题。。。
不过我已经解决了,留下我的解决方式给以后的人作为参考吧。。。

  • 首先是这个undefined的问题,这个是因为,你使用的highlight.js是前端用的js文件,它的封装是这样的:

    (function(xxx){
        /*省略一堆代码*/
        window.hljs=hljs
    })(xxx)

也就是说,你在前端调用的时候,引入这个.js文件,然后直接在你的js里面调用就ok了。但是,在node里面,一切外部引入的js都依赖于require这个函数,而这个函数引入的.js里面又必须使用module.exports暴露出来。很明显,上面的那种没有这种暴露写法,require进来后因为作用域问题无法调用,所以用不了hljs,所以是个undefined。。。这应该算是require的一个闭包问题吧。。。

  • 然后是解决办法。。。我直接就推荐一个最简单粗暴的办法吧。。。
    检查下项目里node_modules文件夹下面是否存在highlight.js这个包,注意,文件名后面是有带.js的:
    如果没有的话,npm install highlight.js或者在package.json里面添加
    然后,把

    hljs = require('../public/js/highlight/highlight.pack.js');

    改为

    hljs = require('highlight.js');

    然后就ok拉~(≧▽≦)/~

阿神

报错的是指哪个undefined,marked还是highlight,我最近也写了点类似的东西,marked+highlight是可以用的。

js"use strict";
///<reference path="../../typings/node/node.d.ts" />
var marked = require('marked');
var hljs = require('highlight.js');

var thunkify = require('thunkify-wrap');

var ArticleModel = require('../models/article');

marked.setOptions({
    renderer: new marked.Renderer(),
    gfm: true,
    tables: true,
    breaks: false,
    pedantic: false,
    sanitize: true,
    smartLists: true,
    smartypants: false,
    highlight: function (code) {
        return hljs.highlightAuto(code).value;
    }
});

exports.fetch = function *(){
    var articleId = this.params['articleId'];

    var result = yield thunkify(ArticleModel.findById,ArticleModel)(articleId);

    if (!result) {
        return this.send(null,1,"文章不存在");
    }   

    result.content = marked(result.content);

    this.send(result,0);
}
伊谢尔伦

强烈推荐Gitblog来写博客。

Gitblog是一个简单易用的Markdown博客系统,它不需要数据库,没有管理后台功能,更新博客只需要添加你写好的Markdown文件即可。 它摆脱了在线编辑器排版困难,无法实时预览的缺点,一切都交给Markdown来完成,一篇博客就是一个Markdown文件。 同时也支持评论,代码高亮,数学公式,页面PV统计等常用功能。 Gitblog提供了不同的主题样式,你可以根据自己的喜好配置,如果你想自己制作博客主题,也是非常容易的。 Gitblog还支持整站静态导出,你完全可以导出整站静态网页部署到Github Pages。

Gitblog官方网站

http://www.gitblog.cn/

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号