我们的产品需要交付给不同的客户,不同的客户难免有不同的需求,为了兼容不同的需求,我们采用的是配置文件的形式。
比如,客户给我们提供一些 API,我们调用这些 API,然后在我们的产品里显示 API 返回的信息。不同的客户这些 API 基本都不相同,于是我们在配置文件中大概有如下配置:
1. "someApi": {
2. "url": "http://xx.xx.xx/code/[params]",
3. "method": "POST",
4. "data": {
5. "condition": {
6. "where": "date='2023-02-07' and addr='sh'"
7. }
8. }
这里 url 后面的 params 是一个动态值,意味着代码里是这样做的:
const params = getParams()
const url = someApi.url + params
同样,第 6 行,2023-02-07 和 sh 也是动态的参数,那么此时该如何拼接上去呢?用字符串相加的办法显然就不太方便了。
这时就可以用模板语法了,如下:
1. "someApi": {
2. "url": "http://xx.xx.xx/code/$0",
3. "method": "POST",
4. "data": {
5. "condition": {
6. "where": "date='$1' and addr='$2'"
7. }
8. }
用 $0 $1 $2作为占位符,代码里可以这样:
1. function replacePlaceholders(template, params) {
2. return template
3. .replace(/\$\d+/g, match => params[Number(match.substring(1))])
4. }
5. const template = JSON.stringify(someApi)
6. const params = [param, date, addr]
7. let obj = replacePlaceholders(template, params)
8. obj = JSON.parse(obj)
9. const url = obj.url
10. const data = obj.data
第 1 ~ 4 行的replacePlaceholders方法用于替换 $0 $1 $2这些占位符,利用了字符串的 replace 方法,细节这里就不做赘述了,主要是提供了一种替换占位符的思路,感兴趣的读者可以测试下。
第 5 行,先把配置的 JSON 对象转为字符串,第 6 行是参数数组,数组的脚标正好和 $0 $1 $2中的 0 1 2对应,那么第 7 行就是用参数替换占位符后的字符串,第 8 行再转回对象,就能得到可以使用的配置了。
通过这种模板语法,配置文件中的动态值可以很方便的替换,大大简化了配置文件的复杂性,也提高了配置文件的灵活性。