babel + browserify で async/await に対応しながら外部スクリプトファイルを読み込む
  1. 銀ねこアトリエ
  2. 海外ノマドブログ
  3. ウェブ制作
  4. npm
  5. babel + browserify で…

babel + browserify で async/await に対応しながら外部スクリプトファイルを読み込む

今回やりたかったことです。

  • babel + browserify でローカルの普通の JS で、npm module 経由でインストール
  • ファイルや外部ファイルを読み込んだり async/fetch のコードをトランスパイルする

どうしても訳合ってこの環境を作りたくてサンプルコードを探して、実際やったらコケる。

GulpでBrowserifyを使った外部スクリプトファイルを読み込むタスクを作成する|designsupply

上記 designsupply さんのコードを参考にしつつ修正しました。

まずは必要なモジュールはこちら。バージョンが古いままになってる可能性があるので、適宜新しいモジュールを入れてください。

この記事は npm や node が使えることを前提に執筆しています。メモ程度の記事なので、必要に応じて参考にする程度にしていただければ幸いです。

package.json / 各種モジュールをインストール

package.json
{
  "name": "browserify+babel",
  "version": "1.0.0",
  "main": "gulpfile.js",
  "scripts": {
    "start": "gulp",
    "prod": "gulp --env production"
  },
  "type": "module",
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@babel/core": "^7.26.7",
    "@babel/preset-env": "^7.26.7",
    "babel-plugin-transform-remove-console": "^6.9.4",
    "babelify": "^10.0.0",
    "browser-sync": "^3.0.3",
    "browserify": "^3.46.1",
    "gulp": "^5.0.0",
    "gulp-if": "^3.0.0",
    "gulp-plumber": "^1.2.1",
    "gulp-uglify": "^3.0.2",
    "minimist": "^1.2.8",
    "through2": "^4.0.2"
  },
}

gulpfile.js にタスクを書く

browserify の処理で file.contents に直接 buf を代入したら処理でコケます。Buffer.from() で文字列などのデータから生成し直して代入します。browserify の中で babelify を適応させます。browserify にオプションをつける時は .configure で渡します。

gulpfile.js
import { series, parallel, src, dest, watch } from 'gulp';
import plumber from 'gulp-plumber';
import browserSync from 'browser-sync';
import minimist from 'minimist';
import gIf from 'gulp-if';
import browserify from 'browserify';
import rename from 'gulp-rename';
import uglify from 'gulp-uglify';
import babelify from 'babelify';
import through2 from 'through2';

const destRootPath = './dest/';
const srcPath = {
  js: './src/js/*.js',
};

const serverInit = (done) => {
  server.init({
    server: {
      baseDir: paths.rootDir,
    },
  });
  done();
};

const envSettings = {
  string: "env",
  default: {
    env: process.env.NODE_ENV || "development",
  },
};

const options = minimist(process.argv.slice(2), envSettings);
const isProduction = options.env === "production" ? true : false;

const exportJs = (done) => {
  const browserified = through2.obj((file, enc, callback) => {
    browserify(file.path, { debug: !isProduction })
      .transform(babelify.configure({
          presets: ['@babel/preset-env'],
          //プロダクションではコメントを削除
          plugins: isProduction ? ['babel-plugin-transform-remove-console'] : [],
          sourceMaps: !isProduction
      }))
      .bundle((error, buf) => {
        // エラー処理
        if(error) {
          return callback(error);
        }
        file.contents = Buffer.from(buf)
        callback(null, file);
      });
  })
  src(srcPath.js, {allowEmpty: true})
    .pipe(plumber({errorHandler: notify.onError("Error: <%= error.message %>")}))
    .pipe(browserified)
    .pipe(rename({suffix: ".min"}))
    .pipe(gIf(isProduction, uglify()))
    .pipe(dest(`${destRootPath}assets/js/`))
    .pipe(server.stream());
  done();
}

const watchFiles = (done) => {
  watch([srcPath.js, './src/js/_inc/*.js'], exportJs);
  done();
};

export default series(serverInit, exportJs, watchFiles);

コマンド実行。

# 開発用
$ npm start
# プロダクション用
$ npm run prod

Swiper や lodash を読み込む

次のコマンドで npm 経由でインストールしたモジュールを直接使うこともできます。

コマンド
npm i swiper -D
JavaScript
import Swiper from 'swiper';
この記事を書いた人

神守 由理子/フロントエンドエンジニア

資金ゼロからフィリピンで起業した海外ノマドエンジニア。IT業界10年以上でテクニカルディレクター(技術責任者)・エンジニア講師・ブリッジSEを経てLenzTechnologies Inc.を設立し、代表を務める。CMS concreteCMSエバンジェリスト。テックブログ以外も「磨耗しない人生」や「海外ノマド」のライフスタイルについて発信。好きなものは肉とハイボール。

  1. Previous
  2. Next