ES6とES5が混在したコードをビルドする
ES6をビルドしてES5にする
ES6のビルド結果とES5のソースをくっつける
難読化とbabel化をする
みたいな事をやりたい。
とりあえずgulpで
code:gulpfile.js
const gulp = require('gulp');
const plumber = require('gulp-plumber');
// ES6ビルド関連
const browserify = require('browserify');
const babelify = require('babelify');
const source = require('vinyl-source-stream');
// ES5ビルド関連
const concat = require('gulp-concat');
const babel = require('gulp-babel');
const uglify = require('gulp-uglify');
// ES6のビルド
gulp.task('es6', _ => {
return browserify("es6/entry.js")
.transform(babelify, {presets: '@babel/preset-env'})
.bundle()
.pipe(source("es6.js"))
.pipe(plumber())
.pipe(gulp.dest('dist'));
});
// ES5のビルド
gulp.task('es5', _ => {
const sources = 'es5/**/*.js;
sources.push('dist/es6.js');
return gulp.src(sources)
.pipe(plumber())
.pipe(concat('es5.js'))
.pipe(gulp.dest('dist'));
});
// デベロップビルド
gulp.task('dev', gulp.series('es6', 'es5'));
// リリースビルド
gulp.task('release', gulp.series('dev', function babel_uglify(){
return gulp.src('dist/es5.js')
.pipe(plumber())
.pipe(babel({
presets: '@babel/preset-env',
sourceType: "script",
compact: false
}))
.pipe(uglify('bundle.js'))
.pipe(gulp.dest('dist'));
}
// 自動ビルド
gulp.task('watch', _ => {
// es6層が更新されたら es6, es5 をビルド
gulp.watch('es6/**/*.js', gulp.task('dev'));
// es5層が更新されたら es5 のみビルド
gulp.watch('es5/**/*.js', gulp.task('es5'));
});
ES6のビルド
多分browserifyが、CommonsJSベースのモジュール解決(require方式)をしてくれる。
これにbabelifyを継ぎ足すと、ESModulesベースのモジュール解決(import/export方式)もできる。みたい?
Getting import/export working ES6 style using Browserify + Babelify + Gulp = -5hrs of life
vinyl-source-streamは、browserifyで作成したデータをgulpで使えるように変換をしている模様
gulp と browserify と vinyl の話
babelify時のpresetは前提としてnpm install -D @babel/preset-env が必要。
たぶんデフォルトオプションか何かだと思う。
@babel/preset-env
やり方の流れはここで
ES5のビルド
単純にソース結合してるだけ
依存関係があるなら、sources配列に列挙する感じ。
最後にES6で作った中間生成物を追記
リリースビルド
先にes6とes5のビルドをする。
gulp.seriesに関数を渡すと、タスクとして追加してくれる模様。
babelのsourceType:'script' で ’use strict' を付けないようにしている。
Babelの出力から"use strict"を除去したい
ちなみにsourceType: 'script'にしていると、import / exportがsyntax errorになってしまう。ES6側ではsourceType: 'module'とするように
babelify v7.2.* で 'sourceType: module' エラーを回避
この定義、eslintにもあって、{"parserOptions":{"sourceType":"script"}にしていると、import/export使ってる場所でlint errorが出てしまう。JSパーサーの設定? らしい?
ecmaFeatures設定項目が廃止された (#4641)
parserOptionsの中は、ESLint の設定ではなく espree (ESLint が使っている構文解析器) の設定です。そのため、parserオプションを指定して別の構文解析器 (babel-eslintとか) を使っている場合は、記述内容がまったく異なる可能性があります。具体的には各々の構文解析器プラグインの発表を参照してください。
babelのcompactは、ソースが長すぎる場合に警告してくれるやつ。
今回はes6層の中間生成物がマージ済みで馬鹿でかいので、無効化してる
Reactでrequireしてたら、Note: The code generator has deoptimised the styling of
uglify は難読化。素直に動いてくれたので良い子