javascript - Gatsby 何时在客户端 js 包中包含第三方库?
问题描述
在 Gatsby 中,我使用 commonmarkjs 从我的 CMS 中解析 markdown 内容并将其呈现为 HTML。这是代码:
import React, { ReactNode, Component } from 'react'
import { HtmlRenderer, Parser } from 'commonmark' // <- I import some commonmarkjs classes...
interface Props {
markdown: string
}
export default class Text extends Component<Props> {
parsedMarkdown: string
constructor(props: Props) {
super(props)
const parser = new Parser()
const renderer = new HtmlRenderer()
this.parsedMarkdown = renderer.render(parser.parse(props.markdown)) // <- ...and use them here
}
render(): ReactNode {
return (
<div className="text">
<div dangerouslySetInnerHTML={{ __html: this.parsedMarkdown }} />
</div>
)
}
}
我运行构建任务,然后使用source-map-explorer分析输出。结果如下:
您可以看到 commonmark 包含在我的捆绑包中。为什么?我认为 Gatsby 会足够聪明,只使用 lib 来构建实际的模板,而不是将它包含在我的包中。
解决方案
由于 React 在客户端对组件进行了水合,因此任何需要执行此操作的代码都将默认包含在 Webpack 包中。如果您想减少一些脂肪,您可以调整 Webpack 配置以替换或省略某些库,但请注意来自 GraphQL 查询的响应导出为page-data.json
(更多信息)并且您需要将其转换为下游的库(即在组件内部)客户端。
如果您想将 Markdown 转换为 HTML,然后dangerouslySetInnerHTML
在组件代码中不包含 Markdown 解析器的情况下使用,您可以使用createResolvers
它在 GraphQL 层中执行此转换,使准备好的字符串在您中可用,page-data.json
并且无需库客户端-边。
这就是说,我发现使用像markdown-to-jsx(缩小 5kb)这样的轻量级 JSX 感知 Markdown 解析器是一种更可取的方法,它允许更大的灵活性和安全性客户端(不使用dangerouslySetInnerHTML
)。
推荐阅读
- php - 在碳中获得不正确的子月值
- angular - Angular 通用 SSR:对于已构建的项目,如何在服务器中进行 Angular 调用 localhost,在客户端时如何进行 IP?
- javascript - 在 Javascript 脚本 MVC 中访问 SelectListItem 值和文本
- reactjs - 如何在 VS 代码中为 React 启用 Intellisense?
- python - 过滤多数组字符串
- r - R在函数中使用未定义变量时没有错误消息
- c# - c#中java数组的等价物只有一个索引
- python - lamda 函数无法运行时间比较
- docker - 如何查询任务元数据端点 v4 以获取内存使用统计信息?
- javascript - Firefox:通过鼠标中键粘贴剪贴板内容