解决proseWrap配置问题的完整思路与实战经验分享
我的写法,亲测靠谱
先说结论吧,proseWrap这个工具的核心就是解决长文本换行问题,尤其在Markdown渲染场景下特别实用。我一般会这样配置:
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>
<p>在真实项目里,光配好proseWrap还不够,还得考虑其他因素。比如之前有个项目对接的是jztheme.com的API接口:</p></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"><p>这里就遇到个问题:后台返回的内容里混杂着HTML标签和普通文本,导致有些段落渲染异常。折腾了半天才发现,需要在marked的配置里加个sanitize选项:</p></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解析器使用之类的,后续我会继续分享这类博客。有更好的实现方式欢迎评论区交流,咱们共同进步。

暂无评论