尝试了 material-components-web 提供的自动初始化方法 mdc-auto-init,感觉要是分别给每个 HTML 标签做标记的话比较繁琐,所以自己写了一个初始化方法。

思路是,把要用到的 node 和 constructor 都写在一个配置文件里面(其实就是一个 list 而已),然后初始化函数遍历配置,并完成相应的构建。

// ./components/mdcConf.ts

// 记得先导入需要用到的包
import { MDCRipple } from '@material/ripple';
import { MDCTextField } from '@material/textfield';
import { MDCTopAppBar } from '@material/top-app-bar';

// 下面是配置,很容易理解吧
const Conf = [
    ['.mdc-top-app-bar', MDCTopAppBar],
    ['.mdc-text-field', MDCTextField],
    [
        [
            '.mdc-button',
            '.primary-action',
        ],
        MDCRipple
    ],
]

export default Conf
// ./components/mdcInit.ts

import mdcConf from "./mdcConf"

const Conf = mdcConf

/** 
 * 初始化函数
 * 参考 <https://git.io/JegHJ>
 */
export default function () {
    let components = []
    for (const i of Conf) {
        if (typeof (i[0]) == 'string') {
            const component = i[0]
            const constructor = i[1]
            components.map.call(document.querySelectorAll(component), function (e: any) {
                return new constructor(e)
            })
        } else if (typeof (i[0]) == 'object') {
            const component = i[0].join(',')
            const constructor = i[1]
            components.map.call(document.querySelectorAll(component), function (e: any) {
                return new constructor(e)
            })
        }
    }
}

最后在需要的地方调用初始化函数就行了!

// ./index.ts
import mdcInit from "./components/mdcInit"

window.onload = function () {
  mdcInit()
}

Q.E.D.