摘要:先來介紹下語法官方示例代碼模塊中對象暴露只需要即可,可以是任何類型的對象。手動導入模塊下某個對象,需要和模塊中定義的名字對應,順序無關。
看一下官方介紹:
Language-level support for modules for component definition.
JS在ES2015開始原生支持模塊化開發(fā),我們之前也曾借助于諸如:
AMD
CommonJS
等的模塊加載器進行過模塊化開發(fā),我想說的是那些都沒有今天要講的簡單好用。
?? 警告,正式版中的ES2015中沒有模塊加載器,所以我們依然需要之前的模塊加載器幫助我們。
先來介紹下語法(官方示例代碼):
//lib/math.js export function sum(x, y) { return x + y; } export var pi = 3.141593; //app.js import * as math from "lib/math"; import {sum, pi} from "lib/math"; console.log("2π = " + math.sum(math.pi, math.pi));
模塊中對象暴露
只需要 export xx 即可,可以是任何類型的對象。
從模塊中導入
使用 import 即可, 幾種方式
import * as xx from ..
導入某個模塊下的所有到某個命名空間下,如示例代碼中的 import * as math from "lib/math", 意即將lib/math下所有暴露的對象導入到math對象下,之后就可以只用math.xxx訪問了。
import {x, y, z} from ..
手動導入模塊下某個對象,x, y, z 需要和模塊中定義的名字對應,順序無關。
略微有點啰嗦了是吧?來看下面這種:
//lib/math.js export default function (x, y) { return x + y; } //app.js import sum from "lib/math";
這樣以來,寫法上簡單了許多,如果有default,也有其他的export怎么辦呢?如下:
import default, {other1, other2} from "someMoule";
一般在開發(fā)中,只暴露一個default的情況占大多數(shù)。
還有一個叫 export *, 用來在某個模塊內將另一個模塊的暴露的對象在這個模塊重新暴露出去,個人覺得用處不是很大,不做過多描述。
下面,我們繼續(xù)實戰(zhàn),依然是在ES2015入門系列10-類 classes中寫的游戲,我們是在一個文件里運行的,下面我們將代碼進行分拆成幾個文件,進入模塊化開發(fā):
使用ES2015入門系列9-Babel和Rollup的配置,我們的目錄結構如下:
es2015-learning
dist
src
Game.js
Hero.js
main.js
Monster.js
Role.js
Game.js 代碼
import Monster from "./Monster.js"; import Hero from "./Hero.js"; export default class Game { //游戲世界 constructor() { this.name = "權利的游戲"; this.hero = new Hero("Jon Snow", 10); // 初始化英雄Jon Snow this.monsters = [ //怪物集合,模擬簡單的游戲關卡。 new Monster("異鬼 01", 1, 10), new Monster("異鬼 02", 3, 30), new Monster("異鬼 03", 5, 50), new Monster("異鬼 04", 10, 100), new Monster("異鬼 05", 15, 150), new Monster("異鬼 06", 20, 200), new Monster("Night King", 50, 500) ]; this.level = 0; // 游戲當前關卡記錄 console.log(`你在[${this.name}]中扮演[${this.hero.name}], 征程即將開始...`); } play() { // 游戲開始 while (this.level < this.monsters.length && ! this.hero.isDead()) { let monster = this.monsters[this.level]; console.log(`關卡[${this.level + 1}] 你遇到了[${monster.name}], 進入戰(zhàn)斗:`); let offensive = this.hero; let defensive = monster; while (! this.hero.isDead() && ! monster.isDead()) { offensive.attack(defensive); let middleman = offensive; offensive = defensive; defensive = middleman; } if (this.hero.isDead()) { console.log(`你被[${monster.name}]打敗了, 游戲結束!`); break; } if (monster.isDead()) { console.log(`你打敗了[${monster.name}] 等級提升:[${monster.level}]`); this.hero.levelUp(monster.level); this.level ++; } } if (this.level === this.monsters.length) { console.log(`恭喜你通關游戲!`); } } }
Hero.js 代碼
import Role from "./Role.js"; export default class Hero extends Role { attack(role) { //攻擊,有概率是用必殺攻擊 if (! this.isCriticalStrike()) { return this.criticalStrike(role); } return this.strike(role); } criticalStrike(role) { //必殺攻擊 let power = parseInt(200 * Math.random() + 50); role.damage(power); console.log(`[${this.name}]使用必殺攻擊了[${role.name}], 造成了[${power}]點傷害`); } isCriticalStrike() { return Math.random() > 0.70; } }
Monster.js 代碼
import Role from "./Role.js"; export default class Monster extends Role { }
Role.js 代碼
export default class Role { //角色基類 constructor(name, level = 1, health = 100) { this.name = name; this.level = level; this.health = health; } isDead() { //判斷角色是否死亡 return this.health <= 0; } levelUp(level = 1) { //升級 this.level += level; } damage(power) { //受到傷害 this.health = this.health - power; } attack(role) { //攻擊 this.strike(role); } strike(role) { //普通攻擊 let power = parseInt(Math.random() * 20 * this.level / 10); role.damage(power); console.log(`[${this.name}]攻擊了[${role.name}], 造成了[${power}]點傷害`); } }
最后, main.js 代碼
import Game from "./Game.js"; new Game().play();
一切準備就緒,執(zhí)行:
npm run build
將編譯后的dist/main.js,放入網頁中,運行,Yeah!It works!
恭喜,我們一起學會了ES2015帶給我們的模塊化開發(fā)!
Keep on hacking!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/83759.html
摘要:雖然夠好用,奈何沒有瀏覽器對其可以完全支持,本文書寫時間,開發(fā)版號稱已經支持的特性。開始安裝本系列假定讀者都有使用經驗,如果還沒有,趕緊去這里了解并安裝吧。到此,我們的已經準備就緒。 通過前面章節(jié)的講解,大家對ES2015的一些新語法有了初步的理解,之前我們的測試代碼都可以直接放入 Chrome Console 中直接運行,為了更好的學習后面的面向對象和模塊開發(fā),我先用一章介紹一下 B...
摘要:所以說的模塊機制沒有解決文件依賴關系和文件異步加載的問題。大部分團隊還是停留在第二第三階段,每個階段的實現(xiàn)都有很多種選擇。希望這篇文章能夠激起大家永遠保持積極向前追求完美代碼的心,不僅對自己的成長也會對公司帶來無限的價值。 本篇技術博客來自有著化腐朽為神奇能力的,Worktile 技術牛人Web 總監(jiān) @徐海峰 大神的分享~滿滿的干貨,你值得擁有! Worktile 的前端構建之路 2...
摘要:入門什么是是一個廣泛使用的轉碼器,可以將代碼轉為代碼,從而在現(xiàn)有環(huán)境執(zhí)行。 babel6 入門 什么是babel Babel是一個廣泛使用的轉碼器,可以將ES6代碼轉為ES5代碼,從而在現(xiàn)有環(huán)境執(zhí)行。 因為es6比es5的代碼更為適合編寫程序,但是因為歷史的原因,現(xiàn)在普遍的瀏覽器并不支持es6代碼(普遍支持es5),即如果你寫es6代碼之后,在瀏覽器上運行出錯,因為瀏覽器的javas...
閱讀 1067·2021-11-23 09:51
閱讀 2412·2021-09-29 09:34
閱讀 3150·2019-08-30 14:20
閱讀 1045·2019-08-29 14:14
閱讀 3182·2019-08-29 13:46
閱讀 1077·2019-08-26 13:54
閱讀 1634·2019-08-26 13:32
閱讀 1427·2019-08-26 12:23