Issue with Babel configuration/inconsistency - babeljs

In the beginning of the docs "What is Babel", an example is listed to explain what Babel does. It states that Babel transforms the following ES2015 input:
[1, 2, 3].map((n) => n + 1);
To the following ES5 equivalent:
[1, 2, 3].map(function(n) {
return n + 1;
});
However, if you enter the same ES2015 code on the home page widget you get the following output:
"use strict";
[1, 2, 3].map(n => n + 1);
Am I missing something? Shouldn't the output be ES5 code?
The reason I am asking is that, after installing all the relevant packages ("#babel/cli", "#babel/core", and "#babel/preset-env") and running Babel from the command line, I am getting the same output as the home page widget.

I found a way to make it work in the Babel command line. I needed to use the --presets option:
npx babel script.js --out-file script-compiled.js --presets=#babel/preset-env
I still don't know why the home page widget does not work though.

You should check your options on the babel try page.
looks
the same output ES6 entry
You should try to create a babel.config.js file to run babel without parameters
// babel.config.js
module.exports = {
presets: [
[
"#babel/preset-env",
{
targets: {
node: "current",
},
},
],
],
};
On this file you can config many options, for example, the presets you want to use. here more information Babel config files

Related

How to pass options to babel plugin transform-modules-commonjs?

I create a Vue 2 project by Vue-Cli 5, then I want to remove "use strick" in the complied code.
As I Know, the #babel/plugin-transform-strick-mode may be enabled via #babel/plugin-transform-modules-commonjs, and the plugin is included in #babel/preset-env under the modules option.
But the Vue-Cli used a preset #vue/babel-preset-app by a plugin #vue/cli-plugin-babel for babel.
So my question is How pass strictMode: false as an option to the transform-modules-commonjs by #vue/babel-preset-app which preset is in the #vue/cli-plugin-babel ?
module.exports = {
presets: [["#vue/cli-plugin-babel/preset", { modules: "auto" }]],
plugins: [
// I tried this way, but it throw many errors like:
/**
ERROR in ./node_modules/axios/dist/node/axios.cjs 11:15-32
Module not found: Error: Can't resolve 'stream' in 'D:\workspace\cqset_offical_website\node_modules\axios\dist\node'
BREAKING CHANGE: webpack < 5 used to include polyfills for node.js core modules by default.
This is no longer the case. Verify if you need this module and configure a polyfill for it.
If you want to include a polyfill, you need to:
- add a fallback 'resolve.fallback: { "stream": require.resolve("stream-browserify") }'
- install 'stream-browserify'
If you don't want to include a polyfill, you can use an empty module like this:
resolve.fallback: { "stream": false }
*/
["#babel/plugin-transform-modules-commonjs", {}],
[
"component",
{
libraryName: "element-ui",
styleLibraryName: "theme-chalk",
},
],
],
};

How to add babel and polyfills to a RequireJs project?

I am working on a legacy project which uses RequireJs to load and resolve all the dependencies. It works fine on modern browsers, but i need to add support for IE11.
I tried to use babel 7 with #babel/preset-env with following .babelrc
{
"presets": [
["#babel/preset-env", {
"useBuiltIns": "usage",
"corejs": 3,
"targets": {
"browsers" : ["ie>=11"]
},
"modules": false
}]
],
"compact": false
}
the import statements injected by the preset as following
import "core-js/modules/es.function.name.js";
cause error "import statements can't be used outside a module". Even when I use modules: "amd", then core-js is imported as
define(["core-js/modules/es.array.filter.js", "core-js/modules/es.object.to-string.js", "core-js/modules/es.string.includes.js", "core-js/modules/es.function.name.js", "core-js/modules/es.regexp.exec.js", "core-js/modules/es.string.split.js", "core-js/modules/es.string.small.js", "core-js/modules/es.string.search.js"], function (_esArrayFilter, _esObjectToString, _esStringIncludes, _esFunctionName, _esRegexpExec, _esStringSplit, _esStringSmall, _esStringSearch) {
"use strict";
//...
});
which throws error like "define is not defined in require.js".
When using useBuiltIns: "entry", and then including core-js as
require(["core-js", ../other modules], function(corejs, ...){
}
)
in the main.js file, it fails to correctly resolve the path of the files even though I have included the path to core-js in require.config.paths.
I tried #babel/runtime and #babel/plugin-transform-runtime but no luck there.
So my question is what would be the best way to add babel and the required polyfills in my RequireJs project so that it is compatible with IE 11?

Can't import tween using import

I have an es6 script that include a tween library with es6 import. The code works fine if it's not transpiled, I mean I can import tween and use it inside the script, if I use webpacke with my configuration the script exit with an error becouse the TWEEN is somehow undefined.
I have tried change extension of tween file with mjs but it generate other errors like
require is not defined
I webpack add core-js modules using require funcition
require("core-js/modules/es.symbol");
The code with issue
'use strict';
...
import {TWEEN} from '../threejs/tween.js';
//import {TWEEN} from '../threejs/tween.js';
...
export class CustomClass extends ParentClass {
constructor(arguments) {
super(arguments);
this.tweenGroup = new TWEEN.Group(); // the line that generate "Cant get Group of undefined"
}
...
}
...
this is my babel-loader configuration configuration
{
test: /\.m?js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader',
options: {
sourceType: 'module'
}
}
},
my babel configuration is look like this
module.exports = {
presets: [
[
'#babel/preset-env',
{
debug: true,
useBuiltIns: 'usage',
corejs: 3
}
]
],
plugins: [
// '#babel/plugin-proposal-class-properties',
// '#babel/plugin-transform-runtime',
// '#babel/runtime-corejs2',
// '#babel/plugin-syntax-dynamic-import',
// '#babel/plugin-syntax-async-generators',
// '#babel/plugin-transform-regenerator',
// '#babel/plugin-transform-async-to-generator',
'#babel/plugin-transform-modules-commonjs',
// '#babel/plugin-transform-typeof-symbol'
]
};
The code with TWEEN import (the first block of code I posted) work just fine if I use it in a project that is not transpiled with babel, but it generate the error if I run devserver. I don't understand why I can't import the Tween properly afetr compilation.
I will apriciate any help.l
Update: I realized I had rather different setup and different issue than you did, but while searching the solution I found this thread with recommendation for npm intalling tween for babel workflow. Maybe that is helpful for you.
I still leave my initial reply here, could be useful for anyone else:
I had some trouble including TWEEN within my js project (eg using import * as TWEEN from '...'), but following the those steps for simple installation I got it working after I included it in HTML, not in js:
<script src="js/libs/Tween.js"></script>

How to list what transforms #babel/preset-env includes?

I like how I can use http://browserl.ist/ to see what browsers the targets query will target in #babel/preset-env.
Is there any similar tools to list what Babel plugins (transforms etc.) the env preset actually includes?
I'm using Webpack as my bundler if it matters.
try add debug:true in #babel/preset-env options, it will list all plugin in use
{
"presets": [
[
"#babel/preset-env",
{
"debug": true,
"targets": {
"chrome": 49,
"firefox": 64,
"safari": 9,
"edge": 13,
"ios": 9
}
}
]
]
}
You can always check out the source for #babel/preset-env, namely the available-plugins.js file lists the available plugins in the preset.
It's just a simple config in your .babelrc or babel.config.js file.
"#babel/preset-env",
{
useBuiltIns: "usage",
debug: true, // this will make babel output actual transform plugins and polyfills in terminal
targets: {
chrome: "53",
},
corejs: 3,
},
But this will not work when you use webpack
As pointed out by #rabidpug, available-plugins.js lists all plugins.
However, which ones are being used depend on your config.
E.g.:
The shippedProposals config option is false by default. As per index.js, this already eliminates all files as listed in data/shipped-proposals.js.
Similarly, the recently added bugfixes option adds more plugins (until babel#8 comes along), listed in #babel/compat-data/plugin-bugfixes.
Solution
Luckily, preset-env has a debug option that just prints out all plugins used when the preset is invoked.
Just add debug to your preset-env options and it will list all plugins (and more).
For convinience, I wrote this little script that independently debugs your plugins list (given a custom set of preset-env options). Run it using node list-preset-env-plugins.js in a folder where you have babel installed:
// list-preset-env-plugins.js
const babelCore = require('#babel/core');
const presetEnv = require('#babel/preset-env').default;
/**
* Your preset-env options.
* #see https://babeljs.io/docs/en/babel-preset-env#options
*/
const presetEnvOptions = {
shippedProposals: true,
debug: true
};
/**
* #see https://github.com/babel/babel/blob/master/packages/babel-helper-plugin-utils/src/index.js
*/
const apiStub = {
version: babelCore.version,
assertVersion() { }
};
// invoke the preset
presetEnv(apiStub, presetEnvOptions);

jquery in didInsertElement jshint error

when using jquery inside the component callback, the callback function for click
understands $ directly, and is working with $, but there is a jshint error
components/xxx.js: line 13, col 17, '$' is not defined.
Using this.$ inside the jquery click callback gives an error at run time
import Ember from 'ember';
export default Ember.Component.extend({
didInsertElement() {
this._super(...arguments);
this.$()
.on('click', function() {
$('.class').something(); //ok but jshint error
this.$('.class').something();//jshint ok but error at run time
});
}
});
Thanks
use this at the top of the file
/* globals $ */
Another approach is to set the following configuration to .jshintrc in the root of your app that prevents checking for the whole app which tells jshint that there are two global variables:
{
"globals": {
"$": false,
"jQuery": false
}
}
Note: If you like you can also use the jQuery version as same as Ember jQuery by changing
$('.class').something(); //ok but jshint error
to
Ember.$('.class').something();
which probably drops that error as well.