@babel/plugin-transform-private-methods
Cette page a été traduite par PageTurner AI (bêta). Non approuvée officiellement par le projet. Vous avez trouvé une erreur ? Signaler un problème →
Ce plugin est inclus dans @babel/preset-env, dans ES2022
History
| Version | Changes |
|---|---|
v7.3.0 | Support private accessors (getters and setters) |
v7.2.0 | Initial Release |
Exemple
class Counter extends HTMLElement {
#xValue = 0;
get #x() {
return this.#xValue;
}
set #x(value) {
this.#xValue = value;
window.requestAnimationFrame(this.#render.bind(this));
}
#clicked() {
this.#x++;
}
}
Installation
- npm
- Yarn
- pnpm
- Bun
npm install @babel/plugin-transform-private-methods --save-dev
yarn add @babel/plugin-transform-private-methods --dev
pnpm add @babel/plugin-transform-private-methods --save-dev
bun add @babel/plugin-transform-private-methods --dev
Utilisation
Avec un fichier de configuration (Recommandé)
Sans options :
{
"plugins": ["@babel/plugin-transform-private-methods"]
}
Avec options :
{
"plugins": [["@babel/plugin-transform-private-methods", { "loose": true }]]
}
Via CLI
$ babel --plugins @babel/plugin-transform-private-methods script.js
Via l'API Node
require("@babel/core").transformSync("code", {
plugins: ["@babel/plugin-transform-private-methods"],
});
Options
loose
boolean, valeur par défaut : false.
Le paramètre de configuration loose doit être identique à celui de @babel/plugin-transform-class-properties.
Lorsque true, les méthodes privées seront assignées directement sur leur parent via Object.defineProperty plutôt qu'un WeakSet. Cela améliore les performances et le débogage (accès normal aux propriétés vs .get()) au détriment d'une possible fuite des "privés" via des méthodes comme Object.getOwnPropertyNames.
Envisagez de migrer vers l'hypothèse de haut niveau privateFieldsAsProperties.
{
"assumptions": {
"privateFieldsAsProperties": true,
"setPublicClassFields": true
}
}
Notez que privateFieldsAsProperties et setPublicClassFields doivent tous deux être définis sur true.
Utilisons l'exemple suivant :
class Foo {
constructor() {
this.publicField = this.#privateMethod();
}
#privateMethod() {
return 42;
}
}
Par défaut, cela devient :
var Foo = function Foo() {
"use strict";
babelHelpers.classCallCheck(this, Foo);
_privateMethod.add(this);
this.publicField = babelHelpers
.classPrivateMethodGet(this, _privateMethod, _privateMethod2)
.call(this);
};
var _privateMethod = new WeakSet();
var _privateMethod2 = function _privateMethod2() {
return 42;
};
Avec { privateFieldsAsProperties: true }, cela devient :
var Foo = function Foo() {
"use strict";
babelHelpers.classCallCheck(this, Foo);
Object.defineProperty(this, _privateMethod, {
value: _privateMethod2,
});
this.publicField = babelHelpers
.classPrivateFieldLooseBase(this, _privateMethod)
[_privateMethod]();
};
var _privateMethod = babelHelpers.classPrivateFieldLooseKey("privateMethod");
var _privateMethod2 = function _privateMethod2() {
return 42;
};
Vous pouvez en savoir plus sur la configuration des options de plugin ici