国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

Angular中使用MathJax遇到的一些問題

2024-05-06 15:23:34
字體:
來源:轉載
供稿:網友

前言

話說我本來是傾向于 KaTeX 的,因為我感覺他很快,而且 MathJax 似乎很難配。但是大家表示對缺少功能的 KaTeX 并無好感,給我提供了一些鉆研 MathJax 的動力。

MathJax簡介

MathJax是一款運行在瀏覽器中的開源數學符號渲染引擎,使用MathJax可以方便的在瀏覽器中顯示數學公式,不需要使用圖片。目前,MathJax可以解析Latex、MathML和ASCIIMathML的標記語言。MathJax項目于2009年開始,發起人有American Mathematical Society, Design Science等,還有眾多的支持者,個人感覺MathJax會成為今后數學符號渲染引擎中的主流,也許現在已經是了。

個人其實也不算鉆研,因為實際上 MathJax 很簡單,調用 MathJax.Hub.Queue(['Typeset', MathJax.Hub, this.element.nativeElement]); 就可以渲染一個元素(這個 this.element.nativeElement 是從 Angular 中調用它 DOM 的語法),這個 .Queue 實際上是 MathJax 自己實現的回調格式,語法非常清奇,參數個數不定,每個都是數組,代表一個回調,順序執行。比如這個 ['Typeset', MathJax.Hub, this.element.nativeElement] ,第一個元素是方法名,第二個元素是 this ,之后的元素都是參數……

我們可以看到這個就相當于執行 MathJax.Hub.Typeset(this.element.nativeElement) ,那為啥不執行這個?因為這方法是同步的,會導致頁面十分卡。于是 MathJax 就自己封裝了一個異步隊列(它的 API 可能幾百年沒改了)

我們說回 Angular。因為要用 markdown,我的思路是用 marked 封裝一個 directive。那么我們就應該在 marked 渲染完成之后用 MathJax 去 Typeset 這個組件。但真的這樣做了,卻產生了奇妙的效果——切換頁面之后,要等將近一分鐘才開始渲染。我在它的隊列里放了幾個 log,發現每個元素都被 queue 了 4 次,幾十個元素,難怪要一分鐘才開始渲染下一頁的內容,即使大部分 markdown 里面根本沒有數學。

這時候我開始灰心了,這個問題就沒有解決辦法了嗎?絕望之時,我想到能不能直接 Typeset document,結果是可以的,而且十分快。所以渲染并不慢,可能是渲染的初始化過程比較慢。那么這時候方案就出來了,我們可以盡量減少渲染次數,同時只渲染 document。只要這個渲染還在進行,那么有再多的元素 queue 上來,我們也只當作 queue 了一次。

于是我就寫了這么個 service:

@Injectable()export class MathjaxService { public isQueued = false; public isRunning = false; window: any; constructor(@Inject(PLATFORM_ID) private platformId: Object) { if (isPlatformBrowser(this.platformId)) { this.window = window as any; } } finishRunning() { this.isRunning = false; if (this.isQueued) { this.queueChange(); } } queueChange() { if (this.isRunning) { this.isQueued = true; } else { this.isQueued = false; this.isRunning = true; if (isPlatformBrowser(this.platformId)) { if (this.window.MathJax) {  this.window.MathJax.Hub.Config({  messageStyle: 'none',  tex2jax: {  // preview: 'none',  inlineMath: [['$', '$']],  processEscapes: true  }  });  this.window.MathJax.Hub.Queue(['log', console, 'start'], ['Typeset', this.window.MathJax.Hub, document], ['log', console, 'end'], ['finishRunning', this]); } } else { this.finishRunning(); } } }}            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 温州市| 大新县| 于都县| 高要市| 隆安县| 岗巴县| 逊克县| 台山市| 汽车| 泊头市| 玉山县| 怀化市| 海林市| 建平县| 赤壁市| 顺昌县| SHOW| 临沧市| 平舆县| 遂昌县| 虎林市| 来宾市| 扶余县| 开远市| 宜良县| 阿尔山市| 盐津县| 习水县| 新平| 涿州市| 阳曲县| 大荔县| 始兴县| 福州市| 通化县| 皋兰县| 镶黄旗| 武义县| 德阳市| 三亚市| 乐业县|