Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do we avoid boilerplate code in files transpiled by Babel?

For example, if I run

babel src --source-maps --out-dir . --modules common

on the src folder of my project, it output all the files in ., but each and every file contains things like

var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();

var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }

function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

Is it somehow possible to have babel write these common boilerplate things to a file, then use require in each file to import them? So the boilerplate code in each file might now look like this:

var { _createClass, _get, _interopRequireDefault, _classCallCheck, _inherits } = require(`./babel-functions`)

and the babel-functions.js file (or whatever it shall be named) would be located in the --out-dir, which is . in my case, and all files would have that require statement at the top. Files in folders would have require(../babel-functions), require(../../babel-functions), etc.

Is there some type of option to do this (or similar) with Babel?

like image 868
trusktr Avatar asked Jul 30 '15 02:07

trusktr


People also ask

How do you use a babel transpiler?

You can use babel-standalone to transpile ES6 to ES5 in a browser environment. You just need to load the “babel-standalone” in your script as highlighted below and write the script you want to transpile, in script tag with type “text/babel” or “text/jsx”. Babel will automatically compile and execute the script.

Which of the following transpiler is used to Transpile JSX to vanilla JS?

💡 Babel officially provides the @babel/preset-typescript preset to transpile TypeScript code to JavaScript and the @babel/preset-react preset to transpile React (JSX) code to JavaScript.

Why do we use babel?

Babel is a toolchain that is mainly used to convert ECMAScript 2015+ code into a backward-compatible version of JavaScript in current and older browsers or environments. Babel's plugins allow you to use the new syntax, right now without waiting for browser support.

How does babel JS work?

Babel is a tool that lets you write your Javascript code using all the latest syntax and features, and run it in browsers that may not support those features. Babel is a transpiler that will translate your modern JS code into an older version of Javscript that more browsers are able to understand.


2 Answers

Using external-helpers is one option, and alternatively you should use runtime, which is more along the lines of what you suggested in that all of the helpers are loaded via require(). runtime also automatically adds references to a polyfill for you, so you would also not do require('babel/polyfill') when using runtime. The only downside of runtime is that because if avoids polluting globals, new prototype methods like Array.prototype.fill do not work and require non-standard code to be used. runtime is great for writing libraries especially though.

like image 183
loganfsmyth Avatar answered Sep 28 '22 22:09

loganfsmyth


Babel provides the ability to use external helpers, instead of inlining them, using babel --external-helpers on the command line or babel.transform("code", { externalHelpers: true }); when calling Babel through the API.

When using either of these, Babel will assume a variable babelHelpers defined with it's helpers.

Requiring babel-core/external-helpers (after installing babel-core from NPM) will inject the helpers into global on node.

Other methods of generating and inserting the helpers are documented at the documentation: https://babeljs.io/docs/plugins/external-helpers.

like image 26
Mark Rousskov Avatar answered Sep 28 '22 22:09

Mark Rousskov