還不知道typescript
是啥的前端童鞋須要作下功課了。javascript
隨着es6
的普及,愈來愈多的npm
模塊都開始用es6
編寫或者重構,看上去或者聽起來都挺高大上的。前端
然而,模塊調用者要使用這些模塊,依然要去npm
倉庫或者github
上仔細看該模塊的api
,哪些方法該傳什麼類型的參數,返回什麼類型的值都須要注意。java
因此說,用es6
來寫模塊僅僅是寫得爽了,用起來和以前並沒什麼不一樣。那如何作到寫起來爽用得也爽呢,答案是typescript
。webpack
用起來爽不爽,貼張gif感覺一下。git
mini-moment這個模塊是我用typescript
寫的,上面gif中能夠看到,Moment
有哪些靜態方法、實例有哪些屬性和方法、方法都接收什麼類型的參數、返回什麼類型的值編輯器都給出了智能提示,不用去看api
了,也不用擔憂傳錯參數。這可不是用es6
寫能作到的。es6
那智能提示是怎麼作到的呢?github
這都要歸功於typescript
的頭文件*.d.ts
,這個文件就像模塊的名片,裏面定義了模塊的各類類/方法/屬性等信息。目前主流的前端/Node.js的類庫/框架都有對應的.d.ts
文件,能夠去DefinitelyTyped上找一下。要使用的話能夠經過tsd或者typings這兩個工具安裝(兩個工具的做者是同一我的,目前tsd
已經廢棄了,可是typings
沒tsd
好用,常常出問題,typings
不行的時候我就會用tsd
)。web
因此咱們寫的模塊要想用的時候有智能提示,就要編寫對應的.d.ts
文件,並把這個文件發佈出去。目前有下面幾種方法typescript
添加到DefinitelyTyped
倉庫npm
fork DefinitelyTyped
這個github
倉庫
提交本身模塊的.d.ts
文件和對應的測試文件
提交pull request
到DefinitelyTyped
,等待做者merge
merge
後調用者就能夠經過tsd
/typings
來安裝使用
此方法能夠解決模塊依賴問題,可是週期太長,DefinitelyTyped
做者可能不會及時merge
,也可能把你的pull request
打回來。
放在本身的github
之類的倉庫
指定頭文件路徑,經過tsd
/typings
來安裝使用
此方法頭文件由本身維護,不方便管理,可是用的時候要處處copy頭文件路徑。
隨模塊一塊兒發佈
編寫頭文件,命名爲index.d.ts
,放在項目根目錄
npm publish
的時候包含這個文件
此方法不須要用tsd
/typings
安裝,npm install
模塊的時候就有了,可是這種方法在依賴其餘模塊的時候就比較坑。
以上幾種方法各有利弊,視狀況選擇。
說了頭文件的編寫,再說文件的打包,打包固然是webpack
了。
咱們用typescript
開發的模塊最終是要編譯成javascript
的,可是typescript
在編譯的時候有些坑爹,當編譯的target
選項設置爲es6
時只會將代碼編譯成es6
的語法,這樣的代碼在不少瀏覽器上是跑不起來的,而將target
設置爲es5
或者es3
的時候又無法使用某些es6
的特性。非常蛋疼,不過還好,咱們有babel
這個好基友,新特性照寫,代碼照跑。
因此咱們的loader
能夠這樣寫:
{ loaders: [ { test: /\.ts?$/, loader: "babel?presets[]=es2015!ts" } ] }
還沒完,咱們開發的模塊編譯後要兼容各類模塊規範,用typescript
或者es6
的模塊導入導出通常是用的import
和export
,通常是編譯成commonjs
或者amd
規範,這樣的代碼不必定在全部環境都能跑起來。不要緊,咱們還有umd
,
因此咱們的webpack.config.js
能夠這樣寫:
"use strict"; const webpack = require('webpack'); const modName = "YOUR_MOD_NAME"; module.exports = { entry: "./src/index.ts", output: { filename: `./dist/${modName}.js`, library: modName, libraryTarget: 'umd', umdNamedDefine: true }, resolve: { extensions: [".ts", ".js"] }, module: { loaders: [ { test: /\.ts?$/, loader: "babel?presets[]=es2015!ts" } ] } };
自從typescript
的生態愈來愈好後,我已再次入坑typescript
,目前已經用typescript
寫了幾個東西了,後續會再分享一些使用typescript
的經驗。