Node.js ve ES6'da module.exports vs. export default
Node'un module.exports
ile ES6'nın export default
arasındaki fark nedir? Node.js 6.2.2de
export default` yapmaya çalıştığımda neden "__ is not a constructor" hatası aldığımı anlamaya çalışıyorum.
Ne işe yarar
'use strict'
class SlimShady {
constructor(options) {
this._options = options
}
sayName() {
return 'My name is Slim Shady.'
}
}
// This works
module.exports = SlimShady
Ne işe yaramıyor?
'use strict'
class SlimShady {
constructor(options) {
this._options = options
}
sayName() {
return 'My name is Slim Shady.'
}
}
// This will cause the "SlimShady is not a constructor" error
// if in another file I try `let marshall = new SlimShady()`
export default SlimShady
245
2
Sorun şu ki
ES6'dan CommonJS'e
Bu yazının yazıldığı sırada hiçbir ortam ES6 modüllerini yerel olarak desteklememektedir. Bunları Node.js'de kullanırken modülleri CommonJS'ye dönüştürmek için Babel gibi bir şey kullanmanız gerekir. Ama bu tam olarak nasıl gerçekleşiyor?
Birçok kişi
module.exports = ...
ifadesiniexport default ...
veexports.foo ...
ifadesini deexport const foo = ...
ifadesine eşdeğer görmektedir. Ancak bu tam olarak doğru değildir ya da en azından Babel'in yaptığı gibi değildir.ES6
default
dışa aktarımları aslında adlandırılmış dışa aktarımlardır, ancakdefault
bir "reserved" adıdır ve bunun için özel sözdizimi desteği vardır. Babel'in named ve default exportları nasıl derlediğine bir göz atalım:Burada, varsayılan dışa aktarımın
foo
gibiexports
nesnesi üzerinde bir özellik haline geldiğini görebiliriz.Modülü içe aktarın
Modülü iki şekilde içe aktarabiliriz: Ya CommonJS kullanarak ya da ES6
import
sözdizimini kullanarak.Sorununuz: Sanırım şöyle bir şey yapıyorsunuz:
'bar'a varsayılan dışa aktarma değerinin atanmasını bekler. Ancak yukarıdaki örnekte görebileceğimiz gibi, varsayılan dışa aktarma
default
özelliğine atanmıştır!Yani varsayılan dışa aktarıma erişmek için aslında yapmamız gereken
ES6 modül sözdizimini kullanırsak, yani
Babel onu
bar
a yapılan her erişimin
.default` erişimine dönüştürüldüğünü görebilirsiniz.tl;dr şu anda bunun çalışması için,
SlimShady
gerektiren veya içe aktaran dosya Babel kullanılarak'use strict'
ile derlenmelidir.Bu hatayla ilk karşılaştığım projede
babel-cli
6.18.0 kullanıyorum.'use strict'
olmadan Kötü Haber Ayıları'use strict', lütfen