1. 程式人生 > >使用Webpack ES6轉ES5 實現模組化(import export)

使用Webpack ES6轉ES5 實現模組化(import export)

1.安裝nodejs:開啟nodejs官網https://nodejs.org/en/,點選碩大的綠色Download按鈕,它會根據系統資訊選擇對應版本(.msi檔案)。
  開啟命令提示符執行下列命令(開啟方式:window + r 輸入cmd回車)
  node -v檢視安裝的nodejs版本
  npm -v檢視npm的版本號
  cd定位到目錄,用法:cd + 路徑
  dir列出檔案列表;
  cls清空命令提示符視窗內容
 
  a.使用npm安裝外掛:命令提示符執行npm install <name> [-g] [--save-dev];

    1) <name>:node外掛名稱。例:npm install gulp-less --save-dev

    2) -g:全域性安裝。將會安裝在C:\Users\Administrator\AppData\Roaming\npm,並且寫入系統環境變數;  
      非全域性安裝:將會安裝在當前定位目錄;  
      全域性安裝可以通過命令列在任何地方呼叫它,本地安裝將安裝在定位目錄的node_modules資料夾下,通過require()呼叫;

    3) --save:將儲存配置資訊至package.json(package.json是nodejs專案配置檔案);

    4) -dev:儲存至package.json的devDependencies節點,不指定-dev將儲存至dependencies節點;
       一般儲存在dependencies的像這些express/ejs/body-parser等等。

    5) 為什麼要儲存至package.json?因為node外掛包相對來說非常龐大,所以不加入版本管理,將配置資訊寫入package.json並
       將其加入版本管理,其他開發者對應下載即可(命令提示符執行npm install,則會根據package.json下載所有需要的包,
       npm install --production只下載dependencies節點的包)。

  b. 使用npm解除安裝外掛:npm uninstall <name> [-g] [--save-dev]  PS:不要直接刪除本地外掛包

    1) 刪除全部外掛:npm uninstall gulp-less gulp-uglify gulp-concat ……???太麻煩

    2) 藉助rimraf:npm install rimraf -g 用法:rimraf node_modules

  c. 使用npm更新外掛:npm update <name> [-g] [--save-dev]

    1) 更新全部外掛:npm update [--save-dev]

  d. 檢視npm幫助:npm help
 
  e.當前目錄已安裝外掛:npm list
2.安裝webpack到全域性 npm install webpack -g
3.安裝webpack到你的專案中(要切盤到你的目錄下)  npm install webpack --save-dev
4.安裝babel:
  npm install babel-core --save-dev
  npm install babel-loader  --save-dev
  npm install babel-preset-es2015 --save-dev

  npm install babel-plugin-transform-runtime

5.直接了當,上乾貨。先看一下目錄結構

6.建立webpack.config.js檔案

module.exports={
    entry:__dirname + '/src/index.js',
    output:{
        path: __dirname + '/build',
        filename:'[name].bundle.js'
    },
    module:{
        loaders:[
            {
                test: /\.js$/,
                exclude: /node_modules/,
                loader: "babel-loader",
                query:
                {
                    presets: ['es2015'],
                    plugins: ['transform-runtime']
                }
            }
        ]
    }
}

7.index.js檔案,使用了es6的import功能,匯入模組,實現模組化
import animal, { say, type as animalType } from './content'
let says = say()
var message = `The ${animalType} says ${says} to ${animal}`
console.log(message)
$('#result').html(message)

8.content.js檔案,export命令除了輸出變數,還可以輸出函式,甚至是類(react的模組基本都是輸出類)
export default 'A cat'
export function say() {
    return 'Hello'
}
export const type = 'dog'

9.package.json
{
  "name": "es6_webpack",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "xutongbao",
  "license": "ISC",
  "devDependencies": {
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.2",
    "babel-preset-es2015": "^6.24.1",
    "webpack": "^3.5.6"
  },
  "dependencies": {
    "babel-plugin-transform-runtime": "^6.23.0"
  }
}

10.index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.js"></script>
</head>
<body>
    <div id="result"></div>
    <script src="build/main.bundle.js" ></script>
</body>
</html>
11.main.bundle.js,webpack打包後的檔案
/******/ (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, {
/******/ 				configurable: false,
/******/ 				enumerable: true,
/******/ 				get: getter
/******/ 			});
/******/ 		}
/******/ 	};
/******/
/******/ 	// 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 = 0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var _content = __webpack_require__(1);

var _content2 = _interopRequireDefault(_content);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var says = (0, _content.say)();
var message = 'The ' + _content.type + ' says ' + says + ' to ' + _content2.default;
console.log(message);
$('#result').html(message);

/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
    value: true
});
exports.say = say;
exports.default = 'A cat';
function say() {
    return 'Hello';
}
var type = exports.type = 'dog';

/***/ })
/******/ ]);

11.執行結果