溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JS模板編譯如何實現

發(fā)布時間:2022-07-20 09:53:53 來源:億速云 閱讀:135 作者:iii 欄目:開發(fā)技術

這篇文章主要介紹了JS模板編譯如何實現的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇JS模板編譯如何實現文章都會有所收獲,下面我們一起來看看吧。

前言

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

這里只聊聊模板編譯。

模板編譯的簡單實現

寫一個最簡單的模板

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

這個模板用數據{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>

渲染數據;

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

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

模板編譯

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

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

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

工具:使用new Function生成函數

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

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

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

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

1、構建模板生成函數

傳入模板字符串,通過new Function方式返回一個新函數。新函數接收一個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);

此時,函數打印如下:

? 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);

再來看看函數的打?。?/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模板編譯如何實現”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“JS模板編譯如何實現”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

js
AI