項目背景
一個簡單的網站,純粹練手用的!
項目技術棧
nodejs + express + ejs + mysql2 + sequlize(orm) + vscode + babel
這是我的package.json
"dependencies": {
? ? "@babel/polyfill": "^7.4.4",
? ? "ejs": "^2.6.1",
? ? "express": "^4.17.1",
? ? "mysql2": "^1.6.5",
? ? "sequelize": "^5.8.8"
? },
? "devDependencies": {
? ? "@babel/cli": "^7.4.4",
? ? "@babel/core": "^7.4.5",
? ? "@babel/node": "^7.4.5",
? ? "@babel/plugin-proposal-class-properties": "^7.4.4",
? ? "@babel/preset-env": "^7.4.5" //問題就出在這里,這個“預設”包含很多“插件”
? }
問題追蹤
class User extends Sequelize.Model {}
User.init({ ... ?},{ ... ?});
User.sync().then(()=>{
User.create({
? ? name: '...',
? ? password: '...',
? ? email: "...",
? ? phoneNumber: "..."
? });
});
上面User.create就報錯了,錯誤如下:
TypeError: Class constructor Model cannot be invoked without 'new'
......省略了
我跟蹤了一下,發現是babel在轉換類的過程中出現了問題,于是想著如何禁止babel轉換ES6的類,最后在node_modules中找到了轉換ES6的插件"@babel/plugin-transform-classes"(插入一下,這個插件是我在安裝預設"@babel/preset-env"的時候安裝的),接下去就在.babelrc中禁用這個插件,.babelrc的配置如下:
{
? ? "plugins": [["@babel/plugin-proposal-class-properties",{"loose" : true}]],
? ? "presets": [["@babel/preset-env",? {"exclude" : ["@babel/plugin-transform-classes"]}]]
}
好了,設置好之后,就不會進行ES6類的裝換了,接下去可以愉快的玩了!
補充一下,這個可能不是唯一方法,網上有人說可以退回到2015這個預設,我沒有去嘗試,因為2015已成過去,我們用babel的其中一個目的就是為了能過使用ES的最新語法,帶來編程的快感并且與未來接軌!