摘要:首先,我們需要安裝選項(xiàng)表示模塊時(shí)開發(fā)環(huán)境中需要的依賴庫,而生產(chǎn)環(huán)境中并不需要。首先,我們需要安裝我們一共安裝了個(gè)模塊是的核心部分定義了轉(zhuǎn)碼規(guī)則是的插件。年時(shí),是最流行的任務(wù)管理工具,其次是。修改,即可配置我們定義了個(gè),即和。
譯者按: JavaScript開發(fā)要用到的工具越來越多,越來越復(fù)雜,為什么呢?你真的弄明白了嗎?
原文: Modern JavaScript Explained For Dinosaurs
為了保證可讀性,本文采用意譯而非直譯。另外,本文版權(quán)歸原作者所有,翻譯僅用于學(xué)習(xí)。
如果你不是老司機(jī),面對眾多JavaScript開發(fā)工具,也許會有些搞不清楚狀況。因?yàn)椋琂avaScript的生態(tài)系統(tǒng)在迅速的變化,新手很難理解這些工具的功能以及它們所解決的問題。對此,我深有體會。
我是1998開始編程的,但是我直到2014才開始學(xué)習(xí)JavaScript。當(dāng)我第一次接觸Browserify時(shí),有這樣一句介紹:
通過將依賴打包,Browserify讓你可以在瀏覽器中使用require(‘modules’)
當(dāng)時(shí),我完全無法理解這句話,也不知道Browserify到底有什么用。
這篇博客將從歷史演進(jìn)的角度,告訴大家今天的JavaScript開發(fā)工具是怎樣發(fā)展而來,以及它們到底有什么作用。首先,我們將介紹一個(gè)非常簡單的網(wǎng)頁示例,它是由最原始的HTML與JavaScript寫的。然后,我們會逐步介紹不同的工具,它們可以解決不同的問題。
原始的JavaScript使用方式最原始的網(wǎng)頁,是用HTML和JavaScript編寫的,沒有那么多幺蛾子。不過,我們需要手動下載并載入依賴的JavaScript文件。如下,index.html中載入1個(gè)JavaScript文件:
JavaScript Example Hello from HTML!
載入了同目錄的index.js文件:
// index.js console.log("Hello from JavaScript!");
這樣,一個(gè)簡單的網(wǎng)頁就寫好了!
現(xiàn)在,假設(shè)你需要使用一個(gè)第三方庫比如moment.js,這個(gè)庫可以幫助我們處理時(shí)間數(shù)據(jù)。比如:
moment().startOf("day").fromNow(); // 20 hours ago
我們需要在的官網(wǎng)下載moment.min.js,放到同一個(gè)目錄中,然后在index.html中載入:
Example Hello from HTML!
可知,moment.min.js先于index.js載入,這樣我們就可以在index.js中調(diào)用moment了:
// index.js console.log("Hello from JavaScript!"); console.log(moment().startOf("day").fromNow());
總結(jié): 直接使用HTML和JavaScript庫編寫網(wǎng)頁非常簡單,也很容易理解;然而,當(dāng)JavaScript庫更新時(shí),我們需要手動下載并載入新版本,這樣確實(shí)很煩...
npm:包管理工具大概2010開始,數(shù)個(gè)JavaScript包管理工具誕生了,它們旨在通過一個(gè)中央倉庫,使得下載和更新JavaScript庫更加自動化。2013年時(shí),Bower可能是最流行的;到了2015年, npm逐漸占據(jù)統(tǒng)治地位;而2016年,yarn開始逐漸引起關(guān)注,但是它的底層是基于npm的。還有一點(diǎn),npm最初是為node.js開發(fā)的,并不是為了前端。因此,使用npm管理前端的依賴庫顯得有點(diǎn)奇怪。
現(xiàn)在,我們來看看如何使用npm安裝moment.js吧。
如果你已經(jīng)安裝了nodejs,則npm也應(yīng)該安裝好了。這時(shí),進(jìn)入index.html所在目錄,執(zhí)行以下命令:
$ npm init
終端會出現(xiàn)數(shù)個(gè)問題,僅需使用enter鍵選擇默認(rèn)配置就好了。命令執(zhí)行之后,會生成一個(gè)package.json文件,npm使用這個(gè)文件保存所有的項(xiàng)目信息。默認(rèn)的package.json是這樣的:
{ "name": "your-project-name", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo "Error: no test specified" && exit 1" }, "author": "", "license": "ISC" }
使用一下命令,即可安裝moment.js:
$ npm install moment --save
這個(gè)命令會做兩件事情:首先,它會下載moment.js,將其保存到node_modules目錄中;然后,它會更新package.json,保存moment安裝信息。
{ "name": "modern-javascript-example", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo "Error: no test specified" && exit 1" }, "author": "", "license": "ISC", "dependencies": { "moment": "^2.19.1" } }
這樣,當(dāng)我們需要與其他人分享這個(gè)項(xiàng)目時(shí),就不需要將node_modules發(fā)送給對方了,而只需要給它package.json文件,因?yàn)樗梢允褂?b>npm install安裝所有依賴庫。
moment.min.js文件位于node_modules/moment/min目錄中,因此我們可以在index.html中直接載入moment.min.js:
JavaScript Example Hello from HTML!
總結(jié): 現(xiàn)在,我們不需要手動下載moment.js了,而可以通過npm自動下載以及更新,這樣方便很多;但是,我們需要在node_modules中找到對應(yīng)的JS文件,然后將它載入HTML,這樣很不方便。
順便分享一個(gè)好東西: 如果你需要監(jiān)控線上JavaScript代碼的錯(cuò)誤的話,歡迎免費(fèi)使用Fundebug!
webpack - 打包工具大多數(shù)編程語言都提供了模塊管理功能,可以在一個(gè)文件中導(dǎo)入另一個(gè)文件的代碼。然而,JavaScript最初并沒有支持這種方式。很長時(shí)間以來,組織多個(gè)JavaScript文件的代碼時(shí),需要使用全局變量。我們在載入moment.min.js時(shí),實(shí)際上也定義了一個(gè)moment全局變量,因此所有之后載入的JS文件,都可以使用它。
2009年,一個(gè)叫做CommenJS的項(xiàng)目出現(xiàn)了,它為JavaScript模塊化定義了一個(gè)規(guī)范,從而允許JavaScript能夠和其他編程語言一樣在不同文件中引入模塊。Node.js是支持CommenJS規(guī)范的,它可以使用require直接引用模塊:
// index.js var moment = require("moment"); console.log("Hello from JavaScript!"); console.log(moment().startOf("day").fromNow());
這樣寫非常方便,然而,如果你在瀏覽器中執(zhí)行上面的代碼,則會收到報(bào)錯(cuò),因?yàn)?require未定義"。
這時(shí),我們就需要打包工具了,它們可以將源代碼構(gòu)建成為兼容瀏覽器的代碼,來避免上面提到的問題。簡單地說,打包工具可以找到所有require語句,然后將它們替代為各個(gè)JS文件中代碼,最終生成的一個(gè)多帶帶的JS文件。
Browserify是2011年發(fā)布,曾經(jīng)是最流行的打包工具;到了2015年, webpack逐漸成為了最主流的打包工具。
現(xiàn)在,我們來看看如何讓require("moment")可以在瀏覽器中執(zhí)行。首先,我們需要安裝webpack:
$ npm install webpack --save-dev
--save-dev選項(xiàng)表示webpack模塊時(shí)開發(fā)環(huán)境中需要的依賴庫,而生產(chǎn)環(huán)境中并不需要。package.json更新之后是這樣的:
{ "name": "modern-javascript-example", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo "Error: no test specified" && exit 1" }, "author": "", "license": "ISC", "dependencies": { "moment": "^2.19.1" }, "devDependencies": { "webpack": "^3.7.1" } }
使用一下命令運(yùn)行webpack:
$ ./node_modules/.bin/webpack index.js bundle.js
bundle.js為生成的打包文件,可以直接在瀏覽器中使用:
JavaScript Example Hello from HTML!
每次修改index.js之后,我們都需要執(zhí)行webpack。webpack的命令比較長,這樣很麻煩,尤其是我們需要使用一些高級選項(xiàng)時(shí)。這時(shí),我們可以將webpack的配置選項(xiàng)寫入webpack.config.js文件:
// webpack.config.js module.exports = { entry: "./index.js", output: { filename: "bundle.js" } };
這樣,我們直接運(yùn)行wepack,而不需要指定任何配置選項(xiàng),就可以進(jìn)行打包了:
$ ./node_modules/.bin/webpack
總結(jié): 使用打包工具之后,對于第三方JS庫,我們不再需要在HTML中使用載入,也不需要定義全局變量了,而是直接在JS代碼中使用require語句。另外,將多個(gè)JS文件打包成為一個(gè)多帶帶的文件也有利于提高網(wǎng)頁性能。然而,每次更新代碼時(shí),我們都需要手動運(yùn)行webpack,這很不方便。
Babel - 新語法特性轉(zhuǎn)碼器轉(zhuǎn)碼器可以將代碼由一個(gè)語言轉(zhuǎn)換為另一個(gè)語言,它對于前端開發(fā)來說非常重要。瀏覽器對于語言的新特性支持通常很慢,我們使用新語言特性編寫的代碼需要轉(zhuǎn)換為兼容的代碼才能正常運(yùn)行。
對于CSS,轉(zhuǎn)碼器有Sass,Less,以及Stylus。對于JavaScript,CoffeeScript 曾經(jīng)是最流行的,而現(xiàn)在用的最多的是babel和TypeScript。CoffeeScript是一門可以編譯到JavaScript的語言,旨在優(yōu)化JavaScript。Typescript也是一門語言,支持最新的ECMAScript,并且支持靜態(tài)類型檢查。而Babel并非一門語言,而只是一個(gè)轉(zhuǎn)碼器,可以將ES6以及更高版本的JavaScript代碼轉(zhuǎn)為ES5代碼,從而兼容各個(gè)瀏覽器。很多人選擇babel,因?yàn)樗罱咏腏avaScript。
現(xiàn)在,我們來看看如何使用Babel。
首先,我們需要安裝babel:
$ npm install babel-core babel-preset-env babel-loader --save-dev
我們一共安裝了3個(gè)模塊:babel-core是Babel的核心部分;babel-preset-env定義了轉(zhuǎn)碼規(guī)則;babel-loader是Babel的webpack插件。
然后,在webpack.config.js中配置babel-loader即可:
// webpack.config.js module.exports = { entry: "./index.js", output: { filename: "bundle.js" }, module: { rules: [ { test: /.js$/, exclude: /node_modules/, use: { loader: "babel-loader", options: { presets: ["env"] } } } ] } };
webpack的配置文件看著有點(diǎn)暈,大致含義是這樣的:告訴webpack找到所有js文件(除了node_modules目錄中的文件),根據(jù)babel-preset-env中的轉(zhuǎn)碼規(guī)則,使用babel-loader進(jìn)行轉(zhuǎn)碼。至于webpack配置的細(xì)節(jié),可以查看文檔。
現(xiàn)在,我們可以開始使用ES2015特性編程了。index.js中使用了模板字符串:
// index.js var moment = require("moment"); console.log("Hello from JavaScript!"); console.log(moment().startOf("day").fromNow()); var name = "Bob", time = "today"; console.log(`Hello ${name}, how are you ${time}?`);
我們也可以使用import來代替require :
// index.js import moment from "moment"; console.log("Hello from JavaScript!"); console.log(moment().startOf("day").fromNow()); var name = "Bob", time = "today"; console.log(`Hello ${name}, how are you ${time}?`);
修改index.js之后,運(yùn)行webpack重新構(gòu)建代碼:
$ ./node_modules/.bin/webpack
其實(shí),現(xiàn)在大多數(shù)瀏覽器都支持了ES2015特性,所以你可以測試一下IE9。在bundle.js中,我們可以看到轉(zhuǎn)碼后的代碼:
// bundle.js // ... console.log("Hello " + name + ", how are you " + time + "?"); // ...
總結(jié): 有了Babel,我們就可以放心地使用最新的JavaScript語法了。但是使用模板字符串這樣簡單的語法顯然沒什么意思,所以不妨試試async/await。不過,現(xiàn)在我們還有兩個(gè)問題需要解決:bundle.js應(yīng)該需要壓縮,這樣才能提高性能,這一點(diǎn)很簡單;每次修改代碼,都需要手動運(yùn)行webpack,這樣很不方便,下一步我們來解決這個(gè)問題。
npm scripts - 任務(wù)管理工具任務(wù)管理工具可以將一些重復(fù)性的任務(wù)自動化,比如合并文件、壓縮代碼、優(yōu)化圖片以及運(yùn)行測試等。
2013年時(shí),Grunt是最流行的任務(wù)管理工具,其次是Gulp。現(xiàn)在,直接使用npm的scripts功能的開發(fā)者似乎越來越多了,這樣不需要安裝額外的插件。
修改package.json,即可配置npm scripts:
{ "name": "modern-javascript-example", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo "Error: no test specified" && exit 1", "build": "webpack --progress -p", "watch": "webpack --progress --watch" }, "author": "", "license": "ISC", "dependencies": { "moment": "^2.19.1" }, "devDependencies": { "babel-core": "^6.26.0", "babel-loader": "^7.1.2", "babel-preset-env": "^1.6.1", "webpack": "^3.7.1" } }
我們定義了2個(gè)scripts,即build和watch。
運(yùn)行build,即可構(gòu)建代碼了(- -progress選項(xiàng)可以顯示構(gòu)建進(jìn)程,-p選項(xiàng)可以壓縮代碼):
$ npm run build
運(yùn)行watch,則一旦javascript修改了,就會自動重新運(yùn)行wepback,這樣開發(fā)就方便多了:
$ npm run watch
還有,我們可以webpack-dev-server,它可以提供一個(gè)網(wǎng)頁服務(wù)器,而且能夠自動重載頁面:
$ npm install webpack-dev-server --save-dev
修改package.json:
{ "name": "modern-javascript-example", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo "Error: no test specified" && exit 1", "build": "webpack --progress -p", "watch": "webpack --progress --watch", "server": "webpack-dev-server --open" }, "author": "", "license": "ISC", "dependencies": { "moment": "^2.19.1" }, "devDependencies": { "babel-core": "^6.26.0", "babel-loader": "^7.1.2", "babel-preset-env": "^1.6.1", "webpack": "^3.7.1" } }
運(yùn)行:
$ npm run server
這時(shí),瀏覽器會自動打開localhost:8080,并訪問index.html。當(dāng)我們修改index.js時(shí),代碼會自動重新構(gòu)建,并且頁面也會自動刷新。這樣我們修改代碼之后,就可以看到瀏覽器中的效果,而不需要任何額外的操作。
正如前文提到過,npm scripts或者其他任務(wù)管理工具可以做的事情還有很多,感興趣的話,可以看看這個(gè)視頻。
結(jié)論簡單總結(jié)一下:剛開始我們用HTML和JS寫代碼;后來我們用包管理工具來安裝第三方庫;然后我們用打包工具實(shí)現(xiàn)模塊化;再后來我們用轉(zhuǎn)碼器從而使用最新語法;最后我們用任務(wù)管理工具來自動化一些重復(fù)的任務(wù)。對于新手來說,這一切都顯得非常頭疼,更頭疼的是這一切還在不斷變化之中。
當(dāng)然也有好消息,各個(gè)框架為了方便初學(xué)者,都會提供工具,把所有配置都弄好: Ember有ember-cli,Angular有angular-cli, React有create-react-app, Vue有vue-cli。這樣,似乎你什么都不用管,只需要寫代碼就可以了。然而,現(xiàn)實(shí)是殘酷的,總有一天你需要對Babel或者Webpack進(jìn)行一些個(gè)性化配置。因此,理解每一個(gè)工具的作用還是非常有必要的,希望這篇博客可以幫助大家。
版權(quán)聲明:
轉(zhuǎn)載時(shí)請注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/11/29/history-of-javascript-tools/
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/90222.html
摘要:是代表的主機(jī)第一個(gè)請求服務(wù),使用線程池,生成一個(gè)單獨(dú)的線程來處理請請求。單個(gè)線程詳細(xì)的數(shù)據(jù)查看線程的堆棧生成某個(gè)時(shí)刻的線程這些線程的來由一清二楚,很快就能定位問題所在。 VisualVM提供分析圖形化監(jiān)控線程的運(yùn)行狀態(tài),有時(shí)候可能不是我們自己代碼沒寫好造成資源的浪費(fèi),而是系統(tǒng)引入了很多第三方包(也包括容器)的時(shí)候,他們可能私自建立線程,如果邏輯處理不當(dāng),可能會造成資源的浪費(fèi)。 以下均用...
摘要:通過鍵返回模式。通過小寫鍵刪除光標(biāo)當(dāng)前所在的字符。無論當(dāng)前光標(biāo)在什么位置,通過鍵在當(dāng)前行末尾進(jìn)行字符插入。注能夠記錄變化的次數(shù)隨編輯器的不同而不同,通常也是可以配置的。 showImg(http://segmentfault.com/img/bVckBC); 本文及圖片轉(zhuǎn)載自:http://www.viemu.com/a_vi_vim... Use i to enter inser...
摘要:這個(gè)速查表主要是分享互聯(lián)網(wǎng)上一些比較常用的工具和技術(shù)常用內(nèi)容,如編輯器的快捷鍵的命令行的選擇器的屬性等,這個(gè)列表簡單收集了常用的工具,可以收藏用于平時(shí)的備忘錄,需要用到的時(shí)候可以及時(shí)查閱。 這個(gè)速查表主要是分享互聯(lián)網(wǎng)上一些比較常用的工具和技術(shù)常用內(nèi)容,如編輯器的快捷鍵、git的命令行、jQuery的API選擇器、CSS的flexbox屬性等,這個(gè)列表簡單收集了常用的工具,可以收藏用于平...
摘要:這個(gè)速查表主要是分享互聯(lián)網(wǎng)上一些比較常用的工具和技術(shù)常用內(nèi)容,如編輯器的快捷鍵的命令行的選擇器的屬性等,這個(gè)列表簡單收集了常用的工具,可以收藏用于平時(shí)的備忘錄,需要用到的時(shí)候可以及時(shí)查閱。 這個(gè)速查表主要是分享互聯(lián)網(wǎng)上一些比較常用的工具和技術(shù)常用內(nèi)容,如編輯器的快捷鍵、git的命令行、jQuery的API選擇器、CSS的flexbox屬性等,這個(gè)列表簡單收集了常用的工具,可以收藏用于平...
摘要:這個(gè)速查表主要是分享互聯(lián)網(wǎng)上一些比較常用的工具和技術(shù)常用內(nèi)容,如編輯器的快捷鍵的命令行的選擇器的屬性等,這個(gè)列表簡單收集了常用的工具,可以收藏用于平時(shí)的備忘錄,需要用到的時(shí)候可以及時(shí)查閱。 這個(gè)速查表主要是分享互聯(lián)網(wǎng)上一些比較常用的工具和技術(shù)常用內(nèi)容,如編輯器的快捷鍵、git的命令行、jQuery的API選擇器、CSS的flexbox屬性等,這個(gè)列表簡單收集了常用的工具,可以收藏用于平...
閱讀 1451·2019-08-29 17:14
閱讀 1653·2019-08-29 12:12
閱讀 733·2019-08-29 11:33
閱讀 3270·2019-08-28 18:27
閱讀 1446·2019-08-26 10:19
閱讀 910·2019-08-23 18:18
閱讀 3532·2019-08-23 16:15
閱讀 2545·2019-08-23 14:14