Babeljs-transpile-es6-modules-to-es5

提供:Dev Guides
移動先:案内検索

BabelJS-ES5へのES6モジュールのトランスパイル

この章では、Babelを使用してES6モジュールをES5にトランスパイルする方法について説明します。

モジュール

JavaScriptコードの一部を再利用する必要があるシナリオを考えます。 ES6は、モジュールの概念であなたを助けます。

  • モジュール*は、ファイルに記述されたJavaScriptコードの塊にすぎません。 モジュール内の関数または変数は、モジュールファイルでエクスポートしない限り使用できません。

簡単に言えば、モジュールは、モジュールにコードを記述し、コードの他の部分がアクセスする必要があるコードの部分のみを公開するのに役立ちます。

モジュールの使用方法と、モジュールをエクスポートしてコードで使用する方法を理解するための例を考えてみましょう。

*add.js*
var add = (x,y) => {
   return x+y;
}

module.exports=add;
*multiply.js*
var multiply = (x,y) => {
   return x*y;
};

module.exports = multiply;
*main.js*
import add from './add';
import multiply from './multiply'

let a = add(10,20);
let b = multiply(40,10);

console.log("%c"+a,"font-size:30px;color:green;");
console.log("%c"+b,"font-size:30px;color:green;");

2つの指定された数値を追加する3つのファイルadd.js、2つの指定された数値を乗算するmultiply.js、およびaddとmultiplyを呼び出して出力をコンソールするmain.jsがあります。

*main.js* で *add.js* および *multiply.js* を指定するには、以下に示すようにまずエクスポートする必要があります-
module.exports = add;
module.exports = multiply;

それらを main.js で使用するには、以下に示すようにインポートする必要があります

import add from './add';
import multiply from './multiply'

ブラウザで実行できるように、ファイルをビルドするにはモジュールバンドラーが必要です。

私たちはそれを行うことができます-

  • Webpackを使用する
  • Gulpの使用

ES6モジュールとWebpack

このセクションでは、ES6モジュールについて説明します。 また、webpackの使用方法も学びます。

始める前に、次のパッケージをインストールする必要があります-

npm install --save-dev webpack
npm install --save-dev webpack-dev-server
npm install --save-dev babel-core
npm install --save-dev babel-loader
npm install --save-dev babel-preset-env

Package.json

ES6モジュールWebpack

npmを使用して実行するスクリプトにパックおよび公開タスクを追加しました。 これが、最終ファイルを作成するwebpack.config.jsファイルです。

webpack.config.js

var path = require('path');

module.exports = {
   entry: {
      app: './src/main.js'
   },
   output: {
      path: path.resolve(__dirname, 'dev'),
      filename: 'main_bundle.js'
   },
   mode:'development',
   module: {
      rules: [
         {
            test:/\.js$/,
            include: path.resolve(__dirname, 'src'),
            loader: 'babel-loader',
            query: {
               presets: ['env']
            }
         }
      ]
   }
};

コマンドnpm run packを実行して、ファイルをビルドします。 最終的なファイルはdev/フォルダーに保存されます。

コマンド

npm run pack

Npm Run Pack

*dev/main_bundle.js* 共通ファイルが作成されます。 このファイルは、add.js、multiply.js、main.jsを組み合わせて、 *dev/main_bundle.js* に保存します。
/******/(function(modules) {//webpackBootstrap
/******/  //The module cache
/******/   var installedModules = {};
/******/
/******/  //The require function
/******/   function __webpack_require__(moduleId) {
/******/
/******/     //Check if module is in cache
/******/      if(installedModules[moduleId]) {
/******/         return installedModules[moduleId].exports;
/******/      }
/******/     //Create a new module (and put it into the cache)
/******/      var module = installedModules[moduleId] = {
/******/         i: moduleId,
/******/         l: false,
/******/         exports: {}
/******/      };
/******/
/******/     //Execute the module function
/******/      modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/     //Flag the module as loaded
/******/      module.l = true;
/******/
/******/     //Return the exports of the module
/******/      return module.exports;
/******/   }
/******/
/******/
/******/  //expose the modules object (__webpack_modules__)
/******/   __webpack_require__.m = modules;
/******/
/******/  //expose the module cache
/******/   __webpack_require__.c = installedModules;
/******/
/******/  //define getter function for harmony exports
/******/   __webpack_require__.d = function(exports, name, getter) {
/******/      if(!__webpack_require__.o(exports, name)) {
/******/         Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/      }
/******/   };
/******/
/******/  //define __esModule on exports
/******/   __webpack_require__.r = function(exports) {
/******/     if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/        Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/     }
/******/     Object.defineProperty(exports, '__esModule', { value: true });
/******/   };
/******/
/******/  //create a fake namespace object
/******/  //mode & 1: value is a module id, require it
/******/  //mode & 2: merge all properties of value into the ns
/******/  //mode & 4: return value when already ns object
/******/  //mode & 8|1: behave like require
/******/   __webpack_require__.t = function(value, mode) {
/******/      if(mode & 1) value = __webpack_require__(value);
/******/      if(mode & 8) return value;
/******/      if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/      var ns = Object.create(null);
/******/      __webpack_require__.r(ns);
/******/      Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/      if(mode & 2 && typeof value != 'string')
               for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/      return ns;
/******/   };
/******/
/******/  //getDefaultExport function for compatibility with non-harmony modules
/******/   __webpack_require__.n = function(module) {
/******/      var getter = module && module.__esModule ?
/******/      function getDefault() { return module['default']; } :
/******/      function getModuleExports() { return module; };
/******/      __webpack_require__.d(getter, 'a', getter);
/******/      return getter;
/******/   };
/******/
/******/  //Object.prototype.hasOwnProperty.call
/******/    __webpack_require__.o = function(object, property) {
               return Object.prototype.hasOwnProperty.call(object, property);
            };
/******/
/******/  //__webpack_public_path__
/******/   __webpack_require__.p = "";
/******/
/******/
/******/  //Load entry module and return exports
/******/   return __webpack_require__(__webpack_require__.s = "./src/main.js");
/******/})
/************************************************************************/
/******/({
/***/      "./src/add.js":
/*!********************!*\
!** *./src/add.js* **!
\********************/
/*! no static exports found */
/***/(function(module, exports, __webpack_require__) {
   "use strict";

   eval(
      "\n\nvar add = function add(x, y) {\n return x + y;\n};
      \n\nmodule.exports = add;
      \n\n//# sourceURL = webpack:///./src/add.js?"
   );
  /***/}),
/***/"./src/main.js":
/*!*********************!*\
!** *./src/main.js* **!
\*********************/
/*! no static exports found */
/***/(function(module, exports, __webpack_require__) {

      "use strict";
      eval(
         "\n\nvar _add = __webpack_require__(/*! ./add */\"./src/add.js\");
         \n\nvar _add2 = _interopRequireDefault(_add);
         \n\nvar _multiply = __webpack_require__(/*! ./multiply */\"./src/multiply.js\");
         \n\nvar _multiply2 = _interopRequireDefault(_multiply);
         \n\nfunction _interopRequireDefault(obj) {
            return obj >> obj.__esModule ? obj : { default: obj };
         }
         \n\nvar a = (0, _add2.default)(10, 20);
         \nvar b = (0, _multiply2.default)(40, 10);
         \n\nconsole.log(\"%c\" + a, \"font-size:30px;color:green;\");
         \nconsole.log(\"%c\" + b, \"font-size:30px;color:green;\");
         \n\n//# sourceURL = webpack:///./src/main.js?"
      );

/***/}),

/***/"./src/multiply.js":
/*!*************************!*\
   !** *./src/multiply.js* **!
   \*************************/
/*! no static exports found */
/***/(function(module, exports, __webpack_require__) {

"use strict";
eval(
   "\n\nvar multiply = function multiply(x, y) {\n return x * y;\n};
   \n\nmodule.exports = multiply;
   \n\n//# sourceURL = webpack:///./src/multiply.js?"
);

/***/})

/******/});

コマンド

以下は、ブラウザで出力をテストするコマンドです-

npm run publish

NPM Run Publish

プロジェクトにindexlを追加します。 これにより、dev/main_bundle.jsが呼び出されます。

<html>
   <head></head>
   <body>
      <script type="text/javascript" src="dev/main_bundle.js"></script>
   </body>
</html>

出力

メインバンドル

ES6モジュールとGulp

Gulpを使用してモジュールを1つのファイルにバンドルするには、browserifyとbabelifyを使用します。 まず、プロジェクトのセットアップを作成し、必要なパッケージをインストールします。

コマンド

npm init

プロジェクトのセットアップを開始する前に、次のパッケージをインストールする必要があります-

npm install --save-dev gulp
npm install --save-dev babelify
npm install --save-dev browserify
npm install --save-dev babel-preset-env
npm install --save-dev babel-core
npm install --save-dev gulp-connect
npm install --save-dev vinyl-buffer
npm install --save-dev vinyl-source-stream

インストール後のpackage.json

gulpfile.jsを作成します。これは、タスクを実行してモジュールをバンドルするのに役立ちます。 上記で使用したものと同じファイルをwebpackで使用します。

*add.js*
var add = (x,y) => {
   return x+y;
}

module.exports=add;
*multiply.js*
var multiply = (x,y) => {
   return x*y;
};

module.exports = multiply;
*main.js*
import add from './add';
import multiply from './multiply'

let a = add(10,20);
let b = multiply(40,10);

console.log("%c"+a,"font-size:30px;color:green;");
console.log("%c"+b,"font-size:30px;color:green;");

gulpfile.jsはここで作成されます。 ユーザーはブラウザを使用し、トランスフォームを使用してバベル化します。 babel-preset-envは、コードをes5に変換するために使用されます。

*Gulpfile.js*
const gulp = require('gulp');
const babelify = require('babelify');
const browserify = require('browserify');
const connect = require("gulp-connect");
const source = require('vinyl-source-stream');
const buffer = require('vinyl-buffer');

gulp.task('build', () => {
   browserify('src/main.js')
   .transform('babelify', {
      presets: ['env']
   })
   .bundle()
   .pipe(source('main.js'))
   .pipe(buffer())
   .pipe(gulp.dest('dev/'));
});
gulp.task('default', ['es6'],() => {
   gulp.watch('src/app.js',['es6'])
});

gulp.task('watch', () => {
   gulp.watch('./*.js', ['build']);
});

gulp.task("connect", function () {
   connect.server({
      root: ".",
      livereload: true
   });
});

gulp.task('start', ['build', 'watch', 'connect']);

私たちはbrowserifyとbabelifyを使用してモジュールのエクスポートとインポートを処理し、次のように同じものを1つのファイルに結合します-

gulp.task('build', () => {
   browserify('src/main.js')
   .transform('babelify', {
      presets: ['env']
   })
   .bundle()
   .pipe(source('main.js'))
   .pipe(buffer())
   .pipe(gulp.dest('dev/'));
});

babelifyがプリセットenvで呼び出される変換を使用しました。

main.jsを含むsrcフォルダーがbrowserifyに与えられ、devフォルダーに保存されます。

ファイルをコンパイルするには、コマンド gulp start を実行する必要があります-

コマンド

npm start

開始

これが dev/ フォルダに作成された最終ファイルです-

(function() {
   function r(e,n,t) {
      function o(i,f) {
         if(!n[i]) {
            if(!e[i]) {
               var c = "function"==typeof require&&require;
               if(!f&&c)return c(i,!0);if(u)return u(i,!0);
               var a = new Error("Cannot find module '"+i+"'");
               throw a.code = "MODULE_NOT_FOUND",a
            }
            var p = n[i] = {exports:{}};
            e[i][0].call(
               p.exports,function(r) {
                  var n = e[i][1][r];
                  return o(n||r)
               }
            ,p,p.exports,r,e,n,t)
         }
         return n[i].exports
      }
      for(var u="function"==typeof require>>require,i = 0;i<t.length;i++)o(t[i]);return o
   }
   return r
})()
({1:[function(require,module,exports) {
   "use strict";

   var add = function add(x, y) {
      return x + y;
   };

   module.exports = add;
},{}],2:[function(require,module,exports) {
   'use strict';

   var _add = require('./add');
   var _add2 = _interopRequireDefault(_add);
   var _multiply = require('./multiply');
   var _multiply2 = _interopRequireDefault(_multiply);
   function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
   var a = (0, _add2.default)(10, 20);
   var b = (0, _multiply2.default)(40, 10);

   console.log("%c" + a, "font-size:30px;color:green;");
   console.log("%c" + b, "font-size:30px;color:green;");
},
{"./add":1,"./multiply":3}],3:[function(require,module,exports) {
   "use strict";

   var multiply = function multiply(x, y) {
      return x * y;
   };

   module.exports = multiply;

},{}]},{},[2]);

indexlで同じを使用し、ブラウザで同じを実行して出力を取得します-

<html>
   <head></head>
   <body>
      <h1>Modules using Gulp</h1>
      <script type="text/javascript" src="dev/main.js"></script>
   </body>
</html>

出力

Gulpを使用するモジュール