UMD를 babel-preset-es2015로 transpile하면 UMD로 작동하지 않습니다.
umd.js
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global.foo = factory());
}(this, (function () {
'use strict';
class foo {}
return foo;
})));
이것을 babel es2015 preset으로 변환하면 다음과 같습니다.
transpiled.js
'use strict';
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
(function (global, factory) {
(typeof exports === 'undefined' ? 'undefined' : _typeof(exports)) === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : global.foo = factory();
})(undefined, function () {
'use strict';
var foo = function foo() {
_classCallCheck(this, foo);
};
return foo;
});
여기서 문제는 global 매개 변수에 걸친
this
부분입니다. 이 this는 스크립트의 최상위 this이므로 babel을 변환하면 undefined로 바뀝니다 (ES module의 최상위 this는 undefined가 된다는 사양이 있기 때문입니다.)UMD는이 최상위 수준의 this에 의존하여 전역 변수로 모듈을 내보내므로이 변환이 걸리면 UMD로 작동하지 않습니다.
대응책
이 문제를 해결하려면 다음과 같이 es2015 사전 설정에 아래와 같이 옵션을 전달하여 현상을 피할 수 있습니다.
.babelrc{
"presets": [
[
"es2015",
{
"modules": false
}
]
]
}
위와 같이 { modules: false }
옵션을 주는 것으로, UMD 스크립트가 ES module 로서 해석되는 것을 막을 수가 있어 트랜스파일의 결과는 아래와 같이 됩니다.
transpiled.jsvar _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
(function (global, factory) {
(typeof exports === 'undefined' ? 'undefined' : _typeof(exports)) === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : global.foo = factory();
})(this, function () {
'use strict';
var foo = function foo() {
_classCallCheck(this, foo);
};
return foo;
});
따라서 this
가 지워지지 않도록 UMD로 기능을 유지할 수 있습니다.
참고:
- htps : // 기주 b. 코 m / 바베 l / 바베 l / 이스에 s / 5082
Reference
이 문제에 관하여(UMD를 babel-preset-es2015로 transpile하면 UMD로 작동하지 않습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kt3k/items/b9948ce27e4acaadacb0
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
{
"presets": [
[
"es2015",
{
"modules": false
}
]
]
}
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
(function (global, factory) {
(typeof exports === 'undefined' ? 'undefined' : _typeof(exports)) === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : global.foo = factory();
})(this, function () {
'use strict';
var foo = function foo() {
_classCallCheck(this, foo);
};
return foo;
});
Reference
이 문제에 관하여(UMD를 babel-preset-es2015로 transpile하면 UMD로 작동하지 않습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kt3k/items/b9948ce27e4acaadacb0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)