您好,登錄后才能下訂單哦!
前言
ECMAScript 6.0(以下簡稱 ES6)是 JavaScript 語言的下一代標準,已經在2015年6月正式發布了。它的目標,是使得 JavaScript 語言可以用來編寫復雜的大型應用程序,成為企業級開發語言。
其實當ES5還沒有完全普及時,ES6就接踵而來了,在發布之后的將近一年內,很多小伙伴都踴躍的學習這門新的語言,之所以說是一門新的語言,是因為跟ES5相比,語法方面變化確實有點大,可以說新的JavaScript語法看上去有種脫胎換骨的感覺。博主也曾躍躍欲試,看了很多語法方面的教程,可是無奈瀏覽器還未完全支持ES6的規范,只看不練,有種眼高手低的感覺,相信朋友們也會有同樣的心情,那么怎樣可以愉快的寫ES6代碼,進而將學到的東西轉化成實踐呢,別擔心,今天我們就來學習ES6構建方面的知識,并搭建一個簡單的學習環境。 下面話不多說了,來一起看看詳細的介紹。
首先需要介紹一個ES6開發利器:Babel。
Babel是一個編譯器,負責將源代碼轉換成指定的語法的目標代碼,可以使之很好的在運行環境中執行我們的代碼。下面我們就來詳細介紹這個神器,利用它來編譯我們的ES6代碼。
Babel給我們提供了一個很方便的命令行工具:babel-cli,利用它我們可以在命令行中執行編譯命令,我們只需使用npm來安裝它即可:
npm install -g babel-cli
除此之外,我們還需要安裝轉碼規則包,Babel支持很多語法的轉碼,比如我們想要將ES6轉換成ES5,那么需要安裝babel-preset-es2015包,如果我們想要編譯React源碼,就需要安裝babel-preset-react,這里我們需要安裝babel-preset-es2015。為此我們創建一個babel-test目錄,在這個目錄里我們創建兩個目錄,es6和js,分別用于放置ES6源代碼和編譯后的ES5目標代碼,然后我們使用“npm init –yes
”命令生成一個默認的package.json文件,babel-test目錄結構如下圖所示:
然后在當前目錄執行下面這行命令安裝ES6轉碼規則包:
npm install babel-preset-es2015 --save-dev
在es6目錄中我們創建了一個test.es6文件用于寫入ES6源代碼,Babel編譯源文件時沒有過多的限制,所以我們也可以選擇使用js或es作為文件后綴名。現在我們將下面這段ES6代碼寫入到test.es6中:
let name = 'Scott'; let greeting = `hello ${name}`; console.log(greeting);
接下來我們就可以來運行babel的命令編譯我們的ES6源代碼了:
babel es6/test.es6 --out-file js/test.js --presets es2015
這行命令的含義是:編譯es6下面的test.es6文件,輸出文件為js下面的test.js,同時指定編譯規則包為es2015。命令執行完成后,我們會在js目錄中找到一個test.js文件,如圖所示:
看以看到,上面的ES6語法已經被編譯成ES5的語法了,這個文件就可以被加載到現有的運行環境執行了。另外,如果我們也可以編譯整個目錄的源文件,只需指定“–out-dir”參數即可:
babel es6 --out-dir js --presets es2015
這行命令的作用是對整個es6目錄中的文件進行編譯,編譯結果輸出到js目錄,如下圖所示:
到目前為止,我們仍手動執行babel命令編譯源代碼,并且我們使用了全局的babel-cli庫,這顯然不是最好的解決方案。如果我們checkout出一個項目,必須要先在全局安裝babel-cli庫才能運行,我們不希望有這樣的依賴。另外不同的項目依賴庫的版本可能都不同,全局的babel-cli庫也不能保證兼容各個項目中其他依賴庫的版本。除此之外,每次手動運行編譯命令也太繁瑣了,我們希望將babel-cli庫安裝到本地,并且使用一個簡單的命令執行編譯任務。
首先我們需要在本地安裝babel-cli庫:
npm install babel-cli --save-dev
現在我們可以卸載全局的babel-cli庫了:
npm uninstall -g babel-cli
最后,我們需要在package.json里面修改一下scripts:
"scripts": { "compile": "babel es6 --out-dir js --presets es2015" }
修改完成之后,我們就可以使用npm來運行這個編譯任務了,只需下面一條簡單的指令即可:
npm run compile
上面只是利用babel將ES6源代碼編譯成JS,在開發中,我們還需要考慮更多東西,比如模塊化開發、自動編譯和構建等等。接下來,我們就搭建一個簡單的ES6開發環境,來支持ES6學習階段的開發。
首先,我們創建一個簡單的應用,它包含一個index.html和es6目錄,es6目錄中又包含hello.es6和main.es6兩個文件,在構建完成后,會多出js和bundle兩個目錄,分別放置編譯后的JS代碼和打包后的bundle文件:
其中,hello.es6定義了greet函數,而main.es6是入口文件,下面是相關的代碼:
//hello.es6 function greet(name) { return new Promise((resolve, reject) => { setTimeout(() => { resolve('hello ' + name); }, 1000); }); } exports.greet = greet;
//main.es6 import "babel-polyfill"; import {greet} from './hello'; greet('Scott').then((greeting) => { document.getElementById('container').innerHTML += greeting; }); document.getElementById('container').innerHTML = 'I am greeting: ';
可以看到,hello.es6中使用了ES6的箭頭函數和Promise來定義一個greet函數,模擬1秒后返回一個hello開頭的字符串,而main.es6中引入了hello.es6并調用了greet函數,最后將結果刷新到DOM元素中。
要使這兩個源代碼文件生效,首先需要把它們編譯成JS,然后再將JS文件打包,現在我們就來使用gulp的方式構建這個過程。
要完成這個任務,我們需要先安裝相關的依賴包:
"devDependencies": { "babel-polyfill": "^6.9.1", "babel-preset-es2015": "^6.6.0", "gulp": "^3.9.1", "gulp-babel": "^6.1.2", "gulp-browserify": "^0.5.1", "gulp-connect": "^3.2.2", "gulp-rename": "^1.2.2", "gulp-sync": "^0.1.4", "gulp-uglify": "^1.5.3" }
其中,babel-polyfill是ES6的補丁,由于babel只支持ES6語法部分的編譯,對于新增的類我們還需要安裝額外的polyfill,雖然現在Chrome和Firefox都已經添加了Promise等新增的類,但為了兼容舊版本的瀏覽器,這里還是安裝比較好。
然后,我們就創建幾個簡單的tasks,下面是gulpfile.js的代碼:
var gulp = require('gulp'); var babel = require('gulp-babel'); var connect = require('gulp-connect'); var browserify = require('gulp-browserify'); var uglify = require('gulp-uglify'); var rename = require('gulp-rename'); var gulpsync = require('gulp-sync')(gulp); gulp.task('compile-es6', function() { return gulp.src('app/es6/*') .pipe(babel({ presets: ['es2015'] })) .pipe(gulp.dest('app/js')); }); gulp.task('pack-js', function() { return gulp.src('app/js/main.js') .pipe(browserify()) .pipe(rename('bundle.js')) .pipe(gulp.dest('app/bundle')); }); gulp.task('compress-bundle', function() { return gulp.src('app/bundle/bundle.js') .pipe(uglify()) .pipe(rename('bundle.min.js')) .pipe(gulp.dest('app/bundle')); }); //build source files to released bundle file gulp.task('build', gulpsync.sync(['compile-es6', 'pack-js', 'compress-bundle']), function() { if (process.argv.pop() == '--dev') { //watch any change and then re-run the tasks gulp.watch('app/es6/*', gulpsync.sync(['compile-es6', 'pack-js', 'compress-bundle'])); } }); //run a server listening at port 8000 gulp.task('server', function() { connect.server({ root: 'app', port: 8000, livereload: true }); });
最后,只需在命令行中執行兩個命令就可以了:
gulp build --dev
gulp server
第一個命令我們是指定了開發模式,開發模式會監聽es6目錄中的文件改動,并重新構建;而第二個命令是用來啟動一個服務,在8000端口監聽。
上面的項目已放到Github上,感興趣的同學可以去看一下,也可以克隆到本地親自試一試。
github地址:https://github.com/scottliu2011/es6-dev
本地下載地址:http://xiazai.jb51.net/201707/yuanma/es6-dev(jb51.net).rar
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。