最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS模板編譯的實現(xiàn)詳情

 更新時間:2022年07月19日 16:54:46   作者:??阿海丶?  
這篇文章主要介紹了JS模板編譯的實現(xiàn)詳情,編譯是一種格式變成另一種格式的過程。編譯會導致好的結果,比如書寫簡單的代碼,編譯出來復雜的代碼;或者提高代碼的使用性能

前言

編譯是一種格式變成另一種格式的過程。編譯會導致好的結果,比如書寫簡單的代碼,編譯出來復雜的代碼;或者提高代碼的使用性能。

這里只聊聊模板編譯。

模板編譯的簡單實現(xiàn)

寫一個最簡單的模板

<p>Hello, {{name}}!</p>

這個模板用數(shù)據(jù){name: "world"}渲染后的結果是:

<p>Hello, world!</p>

解決方法:最簡單的方案,正則替換就行了

const compile = function(template, data) {
  return template.replace(/{{(.+?)}}/g, (match, key) => data[key])
}

const template = "<p>Hello, I'm {{name}}! {{age}} years old!</p>"
const data = {
  name: "hayes",
  age: 18
}
const result = compile(template, data)
console.log(result); // <p>Hello, I'm hayes! 18 years old!</p>

缺點很明顯,除了正則替換字段,其他啥都干不了,

來看看簡單的嵌套需求:

模板:

<p>Hello, I'm {{user.name}}! {{user.age}} years old!</p>

渲染數(shù)據(jù);

const data = {
  user: {
    name: "hayes",
    age: 18
  }
}

現(xiàn)在再使用上面的方法,就失效了。還用正則的話,會很難做。因為需要做語法/詞法分析,來看看大括號內寫的是什么了。

模板編譯

其實對于上述的模板,也可以使用如下方式來寫:

const compile = function(data) {
  return `<p>Hello, I'm ${data.name}! ${data.age} years old!</p>`
}

好處:只需一次編譯,之后再使用就只需要直接填充數(shù)據(jù)即可。而且也方便支持data.user.name這種形式。

工具:使用new Function生成函數(shù)

生成一個函數(shù),傳入x和 y,執(zhí)行return x + y來獲得求和的功能

const fn = new Function("x", "y", "return x + y");

打印fn可以看到輸出的內容如下:

? anonymous(x,y) {
return x + y
}

1、構建模板生成函數(shù)

傳入模板字符串,通過new Function方式返回一個新函數(shù)。新函數(shù)接收一個obj對象

const compile = function(template) {
  // 模板字符串
  let result = "";
  // ...
  return new Function("obj", result);
}

2、正則替換

{{xxx}}找出來,替換為obj.xxx

const compile2 = function(template) {
  // 模板字符串
  let result = template.replace(/{{(.+?)}}/g, (match, key) => {
    return `obj.${key}`
  });
  result = `return "${result}"`;
  return new Function("obj", result);
}
const template2 = "<p>Hello, I'm {{user.name}}! {{user.age}} years old!</p>"
const render2 = compile2(template2)
console.log(render2);

此時,函數(shù)打印如下:

? anonymous(obj
) {
return "<p>Hello, I'm obj.user.name! obj.user.age years old!</p>"
}

我們需要把字符串中的obj.user.nameobj.user.age變成動態(tài)的。

修改一下正則

const compile2 = function(template) {
  // 模板字符串
  let result = template.replace(/{{(.+?)}}/g, (match, key) => {
    return `" + obj.${key} + "`  // 前后添上加號
  });
  result = `return "${result}"`;
  return new Function("obj", result);
}
const template2 = "<p>Hello, I'm {{user.name}}! {{user.age}} years old!</p>"
const render2 = compile2(template2)
console.log(render2);

再來看看函數(shù)的打?。?/strong>

? anonymous(obj
) {
return "<p>Hello, I'm " + obj.user.name + "! " + obj.user.age + " years old!</p>"
}

最終代碼:

const compile = function(template) {
  // 模板字符串
  let result = template.replace(/{{(.+?)}}/g, (match, key) => {
    return `" + obj.${key} + "`
  });
  result = `return "${result}"`;
  return new Function("obj", result);
}
const template = "<p>Hello, I'm {{user.name}}! {{user.age}} years old!</p>"
const render = compile(template)

const data = {
  user: {
    name: "hayes",
    age: 18
  }
}
const result = render(data)
console.log(result); // <p>Hello, I'm hayes! 18 years old!</p>

渲染結果:

"<p>Hello, I'm hayes! 18 years old!</p>"

到此這篇關于JS模板編譯的實現(xiàn)詳情的文章就介紹到這了,更多相關JS模板編譯 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • JS實現(xiàn)骰子3D旋轉效果

    JS實現(xiàn)骰子3D旋轉效果

    這篇文章主要為大家詳細介紹了JS實現(xiàn)骰子3D旋轉效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Echarts自定義圖形的方法參考

    Echarts自定義圖形的方法參考

    在使用ECharts繪制折線圖時,為了豐富圖表的視覺表達,設計師們常常會為視圖搭配上不同的圖標,下面這篇文章主要給大家介紹了關于Echarts自定義圖形的方法參考,需要的朋友可以參考下
    2023-02-02
  • Web3.js查詢以太幣和代幣余額及轉賬

    Web3.js查詢以太幣和代幣余額及轉賬

    這篇文章主要介紹了Web3.js查詢以太幣和代幣余額以及轉賬,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • 如何用javascript去掉字符串里的所有空格

    如何用javascript去掉字符串里的所有空格

    如何用javascript去掉字符串里的所有空格...
    2007-02-02
  • JavaScript localStorage使用教程詳解

    JavaScript localStorage使用教程詳解

    JavaScriptlocalStorage基本上是瀏覽器Window對象中的存儲,您可以在中存儲任何內容localStorage,localStorage及其相關的sessionStorage是 Web Storage API的一部分,我們將在本文詳細了解這些,需要的朋友可以參考下
    2023-06-06
  • 深入淺出webpack之externals的使用

    深入淺出webpack之externals的使用

    這篇文章主要介紹了深入淺出webpack之externals的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • 在JS數(shù)組特定索引處指定位置插入元素的技巧

    在JS數(shù)組特定索引處指定位置插入元素的技巧

    這篇文章主要介紹了如何在JS數(shù)組特定索引處指定位置插入元素?將一個元素插入到現(xiàn)有數(shù)組的特定索引處,需要的朋友可以參考下
    2014-08-08
  • 前端本地數(shù)據(jù)存儲的幾種常見方式總結

    前端本地數(shù)據(jù)存儲的幾種常見方式總結

    在前端開發(fā)中,本地數(shù)據(jù)存儲是實現(xiàn)客戶端數(shù)據(jù)持久化的關鍵技術,以下是幾種常見的前端本地數(shù)據(jù)存儲方式,通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2025-01-01
  • JavaScript 中 avalon綁定屬性總結

    JavaScript 中 avalon綁定屬性總結

    avalon是前端MVVM框架,在js中經常會用到。這篇文章主要介紹了JavaScript 中 avalon綁定屬性總結的相關資料,需要的朋友可以參考下
    2016-10-10
  • 關于javaScript注冊click事件傳遞參數(shù)的不成功問題

    關于javaScript注冊click事件傳遞參數(shù)的不成功問題

    在javaScript中給一個html元素注冊click事件處理函數(shù)時,比如給該處理函數(shù)傳3個參數(shù)??墒遣还苁鞘褂孟旅婺欠N方式都不能給事件處理函數(shù)傳遞參數(shù)
    2014-07-07

最新評論

公安县| 麟游县| 华蓥市| 鲁甸县| 石门县| 榆社县| 西平县| 格尔木市| 鹿泉市| 长寿区| 武川县| 南漳县| 资讯 | 全南县| 航空| 荆门市| 崇信县| 汝南县| 临潭县| 浦县| 军事| 新竹市| 岳阳县| 时尚| 南涧| 柳林县| 文安县| 曲阜市| 山东| 秀山| 平和县| 固镇县| 合山市| 锦屏县| 同心县| 错那县| 遂平县| 南汇区| 葵青区| 阳城县| 岱山县|