You write the next generation JavaScript code (ES6 or ES2018!) and using Babel to convert them to ES5. Even more, with the new @babel/preset-env
module, it is able to intellectually convert your next generation ECMAScript code to compatible syntax based on browser compatibility statistics. So you don't have to target specific browser versions anymore!
ref:
https://babeljs.io/
https://babeljs.io/docs/en/babel-preset-env
There is a real-world project with proper configurations. The following article is based on this project.
https://github.com/vinta/pangu.js
Babel
$ npm install \
@babel/core \
@babel/cli \
@babel/preset-env \
--save-dev
// babel.config.js
module.exports = function(api) {
api.cache(false);
return {
presets: [
"@babel/preset-env"
],
comments: false
};
};
ref:
https://babeljs.io/docs/en/configuration
It is also recommended to put common commands in the scripts
section of the package.json
file.
// package.json
{
...
"scripts": {
"clear:shared": "rm -rf ./dist/shared/",
"clear:browser": "rm -rf ./dist/browser/",
"clear:node": "rm -rf ./dist/node/",
"clear": "npm run clear:shared && npm run clear:browser && npm run clear:node",
"build:shared": "npm run clear:shared && babel src/shared/ -d dist/shared/",
"build:browser": "npm run clear:browser && webpack",
"build:node": "npm run clear:node && babel src/node/ -d dist/node/",
"build": "npm run build:shared && npm run build:browser && npm run build:node",
},
...
}
$ npm run build:node
ref:
https://babeljs.io/docs/en/babel-cli/
Webpack
$ npm install \
webpack \
webpack-cli \
babel-loader \
terser-webpack-plugin \
--save-dev
// webpack.config.js
var _ = require('underscore');
var fs = require('fs');
var path = require('path');
var TerserPlugin = require('terser-webpack-plugin');
var webpack = require('webpack');
var packageInfo = require('./package.json');
var entryPath = './src/browser/pangu.js';
module.exports = {
target: 'web',
// mode: 'development',
mode: 'production',
entry: {
'pangu': entryPath,
'pangu.min': entryPath
},
output: {
path: path.resolve(__dirname, 'dist/browser/'),
filename: '[name].js',
library: 'pangu',
libraryTarget: 'umd',
umdNamedDefine: true
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules|node/,
use: {
loader: 'babel-loader',
options: {
babelrc: false,
presets: [
[
"@babel/preset-env",
{
"modules": "umd"
}
]
]
}
}
}
]
},
devtool: false,
optimization: {
minimizer: [
new TerserPlugin({
include: /\.min\.js$/
})
],
},
}
ref:
https://webpack.js.org/configuration/
@babel/preset-env
transpiles your files to commonjs
by default, which requires the transpiled files to be included by require or import. To make this compatible with your Chrome extension, you need to transpile the files as umd
module.
$ nom run build:browser
Karma
$ npm install \
@babel/register \
karma-babel-preprocessor \
karma-chrome-launcher \
karma-coverage \
karma-mocha \
karma-mocha-reporter \
puppeteer \
chai \
--save-dev
// karma.conf.js
module.exports = function(config) {
config.set({
frameworks: [
'mocha'
],
browsers: [
'ChromeHeadless'
],
files: [
'node_modules/chai/chai.js',
'dist/browser/pangu.js',
'test/browser/*.js',
],
preprocessors: {
'dist/browser/pangu.js': ['coverage'],
},
reporters: [
'mocha',
'coverage'
],
singleRun: true,
coverageReporter: {
type: 'lcov',
subdir: '.'
},
});
};
ref:
https://karma-runner.github.io/3.0/config/configuration-file.html
$ nom run test:browser