解决proseWrap配置问题的完整思路与实战经验分享

杰森 工具 阅读 1,386
赞 31 收藏
二维码
手机扫码查看
反馈

我的写法,亲测靠谱

先说结论吧,proseWrap这个工具的核心就是解决长文本换行问题,尤其在Markdown渲染场景下特别实用。我一般会这样配置:

解决proseWrap配置问题的完整思路与实战经验分享

marked.setOptions({
  renderer: new marked.Renderer(),
  gfm: true,
  breaks: false,
  pedantic: false,
  smartLists: true,
  smartypants: false,
  proseWrap: 'always'
});

这里最关键的就是 proseWrap: ‘always’ 这个设置。为什么这么配?因为在实际项目中我发现,默认的换行处理经常会把段落搞乱,特别是用户复制粘贴的内容。用了’always’后,能确保每个段落在渲染时都正确换行,不会出现那种一行到底的情况。

这几种错误写法,别再踩坑了

先说说我踩过的几个坑。最开始用的时候,直接用了默认配置,结果发现用户的长段落内容全都挤在一行里,页面惨不忍睹。代码大概长这样:

marked.setOptions({
  // 其他配置...
  proseWrap: 'preserve' // 默认值
});

这种写法的问题是,它完全保留了原始文本的换行符。但问题是,大部分用户写内容的时候根本不会在意换行,经常就是一段文字直接怼上去。最后渲染出来就是一整行文字,阅读体验极差。

还有个常见的错误是这样写的:

marked.setOptions({
  // 其他配置...
  breaks: true,
  proseWrap: 'never'
});
`>
<p>看着好像没问题对吧?实际上这会导致另一个极端:每个换行符都会被转成<br>标签。用户随便敲个回车,页面上就多一个换行。特别是在移动端看的时候,排版简直没法看。</p>

<h2>实际项目中的坑</h2>
&lt;p&gt;在真实项目里,光配好proseWrap还不够,还得考虑其他因素。比如之前有个项目对接的是jztheme.com的API接口:&lt;/p&gt;</code></pre>javascript
fetch('https://jztheme.com/api/content')
  .then(res => res.json())
  .then(data => {
    document.getElementById('content').innerHTML = marked.parse(data.content);
  });
<pre class="pure-highlightjs line-numbers language-none"><code class="no-highlight language-none">&lt;p&gt;这里就遇到个问题:后台返回的内容里混杂着HTML标签和普通文本,导致有些段落渲染异常。折腾了半天才发现,需要在marked的配置里加个sanitize选项:&lt;/p&gt;</code></pre>javascript
marked.setOptions({
  renderer: new marked.Renderer(),
  gfm: true,
  breaks: false,
  pedantic: false,
  smartLists: true,
  smartypants: false,
  proseWrap: 'always',
  sanitize: true // 关键配置
});
`>

另外要注意的是,proseWrap的效果还跟CSS样式有关系。记得加上这些基础样式:

.markdown-body p {
  word-break: break-word;
  overflow-wrap: break-word;
  margin-bottom: 1em;
}

不加这些样式的话,在某些特殊字符(比如超长URL)的情况下还是会撑破容器。我就曾经因为这个问题被测试小姐姐追着打。

其他注意事项

有几个小细节要提醒下:

  • 记得处理表格的换行问题,marked默认的表格渲染对长文本支持不太好
  • 如果要用highlight.js做代码高亮,得注意它跟proseWrap的兼容性
  • 移动端适配时,建议给段落加个max-width限制

还有个挺隐蔽的问题:当你的内容是从富文本编辑器过来的时候,可能会带一些特殊的换行符(rn之类),建议在parse之前统一处理下:

function normalizeContent(content) {
  return content.replace(/rn/g, 'n').replace(/r/g, 'n');
}

const safeContent = normalizeContent(rawContent);
document.getElementById('content').innerHTML = marked.parse(safeContent);

结尾唠叨两句

以上是我个人对proseWrap使用的一些实战总结。总的来说,这个工具确实能解决很多文本渲染的问题,但要注意的地方也不少。建议大家在用的时候多测试各种边界情况,特别是用户输入的内容,那真是啥奇葩格式都有。

这个技巧的拓展用法还有很多,比如结合其他markdown解析器使用之类的,后续我会继续分享这类博客。有更好的实现方式欢迎评论区交流,咱们共同进步。

本文章不代表JZTHEME立场,仅为作者个人观点 / 研究心得 / 经验分享,旨在交流探讨,供读者参考。
发表评论

暂无评论