Babel版本:7.6.0
我正在研究a JavaScript widget供浏览器使用,但这取决于为NodeJS(edtf.js)构建的库。特别是,它扩展了this file中内置的Date
。
到目前为止,它似乎可以在我测试过的所有现代浏览器上运行。但是为了确保它对较旧版本而言是防弹的,我想到了对edtf库进行Babel化。这是my Gruntfile.js中的browserify配置:
browserify: {
development: {
src: [
"node_modules/edtf/index.js"
],
dest: './dist/js/edtf.js',
options: {
browserifyOptions: { standalone: 'edtf' },
transform: [["babelify", {
"presets": ["@babel/preset-env"], "plugins": [["@babel/transform-runtime", {"helpers": false}]]
}]]
}
}
},
经过大量修改后,此配置至少在页面上加载生成的javascript文件时不会触发任何错误,但是一旦我开始使用该库,它就会因以下错误而中断:
edtf.js:3040 Uncaught TypeError: this is not a Date object.
at Date.getUTCFullYear (<anonymous>)
at Date.get (edtf.js:3040)
at Date.toEDTF (edtf.js:2960)
at Date.value (edtf.js:5696)
at new Date (<anonymous>)
一个previous SO answer正确地指出,内置的子类仅受Babel的部分支持,according to their documentation,并建议使用transform-builtin-extend插件,可惜该插件无法维护2年,仅适合Babel 6。
transform classes不能为此工作吗?我尝试将其包含在我的配置中,但它完全没有改变。
无论如何,如果有人对如何前进有任何建议,here is the github branch to try it for yourself,只需运行npm install
,npm run build
并在浏览器中打开index.html
文件。任何建议都值得欢迎:我不喜欢Babel的想法,但我想确保我可以安全地使用此edtf库,并使它在大多数浏览器上都可以使用。
答案 0 :(得分:2)
一个基本的问题是,不能仅使用ES5和更早的功能来子类Date
。根本不起作用(例如Error
和Array
)。
如果您需要使用转译到ES5或更早版本的代码,则必须修改您的类,以便它不会尝试子类化Date
。 (例如,使用Date
实例作为成员,然后转发方法调用...)