精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

從JavaScript到TypeScript - 模塊化和構建

開發 前端
TypeScript 帶來的最大好處就是靜態類型檢查,所以在從 JavaScript 轉向 TypeScript 之前,一定要認識到添加類型定義會帶來額外的工作量,這是必要的代價。不過,相對于靜態類型檢查帶來的好處,這些代價是值得的。當然,TypeScript 允許不定義類型或者將所有類型定義為 any,但如果這樣做,TypeScript 帶來的大部分靜態檢查功能都會失去作用。

[[188004]]

TypeScript 帶來的***好處就是靜態類型檢查,所以在從 JavaScript 轉向 TypeScript 之前,一定要認識到添加類型定義會帶來額外的工作量,這是必要的代價。不過,相對于靜態類型檢查帶來的好處,這些代價是值得的。當然,TypeScript 允許不定義類型或者將所有類型定義為 any,但如果這樣做,TypeScript 帶來的大部分靜態檢查功能都會失去作用,換言之,也就沒必要使用 TypeScript 了。

模塊化

在轉換之前還要注意的一個問題就是模塊化。早期的 JavaScript 代碼基本上是每個 HTML 頁面對應一個或幾個 JavaScript 腳本,那時候的 JavaScript 代碼中很少有模塊化的概念。不過隨著 Web 2.0 的興起,大量的工作從后端移到前端,JavaScript 程序變得越來越復雜,模塊化成為剛需,大量的模塊化框架隨之而來,其中比較有名的有 RequestJS 及其帶來的 AMD 標準,還有 SeaJS 帶來的 CMD 標準。而隨著 Node.js 的興起以及 JavaScript 的全棧化,又有了 CommonJS 標準。之后又出現了廣為使用的 SystemJS。當然少不了 ES6 的模塊化標準,雖然到目前為止 Node.js 和大部分瀏覽器都還不支持它。

TypeScript 本身支持兩種模塊化方式,一種是對 ES6 的模塊的微小擴展,另一種是在 ES6 發布之前本身模仿 C# 的命名空間。大部分使用命令空間的場景都可以使用 ES6 模塊化標準來代替。我們先來看一看兩種模塊化方式區別。

命名空間

使用命令空間寫的 TS 腳本在轉譯成 JS 后,可以不使用任何模塊加載框架,直接在頁面中加載即可使用。不過很遺憾,這種方式轉義出來的 JS 程序不能直接在 Node.js 中使用。因為 tsc 不為會命名空間形式的模塊生成 modules.exports 對象以及 require 語句。

有一種情況例外。將所有 .ts 文件轉譯成一個 .js,假設叫 all.js,那么它可以通過 node all 來運行。這種情況下不需要任何模塊的導入導出。

不過在瀏覽器環境中,嚴格的按照依賴順序引入生成的 .js 文件是可行的。早期沒有使用模塊化的 JS 文件就可以使用“命名空間”形式的模塊化寫法,甚至可以將原來成百上千行的大型 JS 源文件,拆分成若干小的 TS 文件,再通過 tsc --outfile 輸出單一 JS 文件來使用,這樣既能實現模塊化重構,又能不改變原有的 HTML(或其它動態頁面文件)的代碼。

還有一點需要注意的是,在指定生成單一輸出文件的情況下,TypeScript 不會通過代碼邏輯去檢查模塊間的依賴關系。默認情況下它會按文件名的字母序逐個轉譯 .ts 文件,除非源文件中通過 /// <reference path="..." /> 明確指定了依賴項。

ES6 模塊

在 TypeScript 使用 ES6 模塊語法來實現模塊化的情況下,tsc 允許通過 module 參數來指定生成的 .js 會應用于何種模塊化框架,默認的是 commonjs,其它比較常用的還有 amd、system 等。

顯然,如果原來的 JS 程序使用了 AMD 框架,在轉換成 TS 的時候,就可以使用 ES6 模塊寫法,并通過 tsc --module amd 來輸出對應的 JS 文件,同樣不需要修改原來的頁面文件。

但是,如果原來的 JS 文件沒有使用任何模塊框架的情況下,轉換為采用 ES6 模塊寫法的 TS 代碼,在構建的時候就會麻煩一點。這種情況下即使構建成單一輸出文件,仍然會需要模塊化框架的支持,比如需要 AMD 的 define 和 require,或者需要 System 的 API 支持。

為了避免引入模塊化框架,可以考慮以 commonjs 標準輸出 JS,然后通過 Webpack 來把所有生成的 JS 打包成單一文件。這里既然用到了 Webpack,構建配置就可以更靈活了,因為 Webpack 可以指定多個 entry,可以有多個輸出,它會通過 import ... 轉譯成的 require(...) 自動檢查依賴項。而且 Webpack 還可以使用 ts-loader 直接處理 .ts 文件而不需要先使用 tsc 來進行轉譯。如果在 TS 中用到了高版本 ECMAScript 語法,比如 async/await,還可以通過 babel-loader 來增加一層處理……非常靈活。

但這里往往會有一個問題,生成的 .js 中所有定義都不在全局范圍,那么腳本引入網頁之后,如何使用其中定義的內容?這需要借助全局對象 window——這里不需要考慮 Node.js 的全局對象 global,因為在 Node.js 下一般是采用模塊化的方式引入,不需要向全局對象注入什么東西。

向 window 注入對象(或函數、值等)的方法也很簡單,分兩步:申明、賦值,比如:

  1. import MyApi from "./myapi"
  2.  
  3. declare global { 
  4.     interface Window { 
  5.         mime: MyApi; 
  6.     } 
  7.  
  8. window.mime = new MyApi();  

常用的構建配置

我們早期項目中使用 TypeScript 的命名空間,不過最近幾乎都重構成 ES6 模塊方式了。由于會用到 async 函數,所以一般會配置 TypeScript 輸出 ES2017 代碼,再通過 Babel 轉譯成 ES5 代碼,***由 Webpack 打包輸出。

tsconfig.json

  1.     "compilerOptions": { 
  2.         "module""commonjs"
  3.         "target""es2017"
  4.         "lib": [ 
  5.             "dom"
  6.             "es6"
  7.             "dom.iterable"
  8.             "scripthost"
  9.             "es2017" 
  10.         ], 
  11.         "noImplicitAny"false
  12.         "sourceMap"false 
  13.     } 
  14.  

在 target 為 es5 或 es6 的時候,TypeScript 會有默認的 lib 列表,這在官方文檔中有詳細說明。target 定義為 es2017 是為了支持 async 函數,但這個配置沒有默認 lib 列表,所以參考官方文檔對 --target es6 使用的 lib 列表,補充 es2017 類型庫即可。

webpack.config.js

這里使用了 Webpack2 的配置格式。

  1. module.exports = { 
  2.     entry: { 
  3.         index"./js/index" 
  4.     }, 
  5.     output: { 
  6.         filename: "[name].js" 
  7.     }, 
  8.     devtool: "source-map"
  9.     resolve: { 
  10.         extensions: [".ts"
  11.     }, 
  12.     module: { 
  13.         rules: [ 
  14.             { 
  15.                 test: /\.ts$/, 
  16.                 use: [ 
  17.                     { 
  18.                         loader: "babel-loader"
  19.                         options: { 
  20.                             presets: ["es2015""stage-3"
  21.                         } 
  22.                     }, 
  23.                     "ts-loader" 
  24.                 ], 
  25.                 exclude: /node_modules/ 
  26.             } 
  27.         ] 
  28.     } 
  29. };  

gulp task

如果還使用 gulp,任務是這樣寫的

  1. const gulp = require("gulp"); 
  2. const gutil = require("gulp-util"); 
  3.  
  4. // 轉譯JavaScript 
  5. gulp.task("webpack", () => { 
  6.     const webpack = require("webpack-stream"); 
  7.     const config = require("./webpack.config.js"); 
  8.     return gulp.src("./js/**/*.ts"
  9.         .pipe(webpack(config, require("webpack"))) 
  10.         .on("error"function(err) { 
  11.             gutil.log(err); 
  12.             this.emit("end"); 
  13.         }) 
  14.         .pipe(gulp.dest("../www/js")); 
  15. });  

這里需要注意的是 webpack-stream 默認使用的是 webpack1,而我們的配置需要 webpack2,所以為它指定第二個參數,一個特定版本的 webpack 實例 (由 require("webpack") 導入的)。

需要的 Node 模塊

從上面的構建配置中不難總結出構建過程需要安裝的 Node 模塊,有這樣一些

  • gulp
  • gulp-util
  • webpack-stream
  • webpack
  • ts-loader
  • typescript
  • babel-loader
  • babel-core
  • babel-preset-es2015
  • babel-preset-stage-3

在 Node.js 環境直接運行 .ts

在 Node.js 中可以通過 ts-node 包來直接運行 TypeScript 代碼。需要做的只是在入口代碼文件(當然是個 .js 代碼)中添加一句

  1. require('ts-node').register({ /* options */ }) 

或者

  1. require('ts-node/register'

因為 Node.js 7.6 開始已經直接支持 async 函數語法,所以即使用到了這個語法,也不用擔心 ts-node 在內存的轉譯結果不能運行。

入口文件仍然必須是 .js 文件,這是個小小的遺憾,不過對于使用 Node.js 寫構建腳本的用戶來說,有兩個好消息:gulp 和 webpack 都直接支持 .ts 入口(或配置)文件。比如以 gulp 為例,可以定義 gulpfile.ts (注意擴展名是 .ts) 如下

  1. import * as gulp from "gulp"
  2.  
  3. gulp.task("hello", () => { 
  4.     console.log("hello gulp"); 
  5. });  

不過 gulp 也是通過 ts-node 模塊來實現使用 TypeScript 的,而 ts-node 的功能依賴于 typescript,所以別忘了安裝這兩個模塊。 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2019-08-28 16:18:39

JavaScriptJS前端

2025-07-10 03:00:00

2020-05-12 08:39:50

JavaScript工具技術

2015-11-23 09:50:15

JavaScript模塊化SeaJs

2017-02-13 18:46:38

Android模塊化組件化

2013-08-20 18:39:34

JavaScript模requireJS

2017-07-11 11:02:03

APP模塊化架構

2010-08-02 08:54:53

Flex模塊化

2013-08-20 18:18:55

CSS模塊化Normalize.c

2020-09-17 10:30:21

前端模塊化組件

2017-05-18 10:23:55

模塊化開發RequireJsJavascript

2013-08-20 15:31:18

前端模塊化

2022-03-11 13:01:27

前端模塊

2015-10-10 11:29:45

Java模塊化系統初探

2020-09-18 09:02:32

前端模塊化

2021-12-24 07:10:36

架構分層模塊化

2021-06-10 18:40:32

ES 標準模塊化

2021-12-02 05:57:04

模塊化UPS電源

2011-12-21 16:08:43

2015-12-11 15:51:36

華為模塊化數據中心
點贊
收藏

51CTO技術棧公眾號

中文字幕乱码在线| 中文字幕欧美人与畜| 伊人手机在线视频| 日本电影一区二区| 欧美mv日韩mv| 日韩精品一区二区三区色欲av| 免费网站看v片在线a| 成人爱爱电影网址| 国产精品久久久久久一区二区| 2018天天弄| 不卡日本视频| 亚洲第一免费网站| 欧美日韩一区二区三区69堂| 成年网站在线视频网站| 中文字幕精品一区二区精品绿巨人 | 日本不卡的三区四区五区| 欧美成人精品一区| 国产一区二区三区四区在线| 国产成人在线中文字幕| 欧美日韩免费视频| 国产三区在线视频| 日韩影视在线| 国产精品久久久久久久浪潮网站| 激情伦成人综合小说| 国产精品高潮呻吟久久久| 久久av在线| 国内精品久久久久久久久| 五月天免费网站| 九九热精品视频在线观看| 亚洲精品在线一区二区| www.国产福利| 日韩一区二区三区免费| 午夜精品影院在线观看| 日本精品福利视频| 欧美精品电影| 久久久久久久一区| 国产尤物99| 免费国产羞羞网站视频| 国产成人在线视频网站| 成人免费视频网址| 又骚又黄的视频| 久久久久在线| 日韩av片电影专区| aaaaaa毛片| 久久久久网站| 国产精品久久久久免费a∨| 国产在线观看黄色| 一区二区日韩免费看| 97精品视频在线| 国产精品a成v人在线播放| 亚洲欧美一级二级三级| 欧美尺度大的性做爰视频| 91视频综合网| 国产精品99一区二区| 欧美激情亚洲国产| 国产小视频在线看| 亚洲激情亚洲| 2019中文字幕全在线观看| 中文字幕亚洲精品一区| 美女爽到呻吟久久久久| 国产成人精品999| 国产精品无码粉嫩小泬| 喷白浆一区二区| 成人h猎奇视频网站| 国产色在线视频| 国产宾馆实践打屁股91| 国产在线精品二区| 九色蝌蚪在线| 亚洲欧洲另类国产综合| 波多野结衣与黑人| av在线中出| 色哟哟亚洲精品| 第四色婷婷基地| 国产精品美女久久久久| 精品精品国产高清一毛片一天堂| 在线精品一区二区三区| 欧美精美视频| 美日韩精品视频免费看| 日本免费一二三区| 三级久久三级久久| 亚洲最大福利视频网| 天天射天天色天天干| 国产亚洲午夜高清国产拍精品| 亚洲一二区在线| 丁香花视频在线观看| 色婷婷av一区二区三区之一色屋| 国产精品一区二区小说| 久久久久久久久成人| 精品香蕉在线观看视频一| 成人在线手机视频| 欧美黄色一区| 国产成人黄色av| 亚洲国产精彩视频| 久久久精品黄色| 亚洲国产一二三精品无码| 在线中文字幕播放| 欧美精品一二三| 性欧美丰满熟妇xxxx性久久久| 成久久久网站| 国内揄拍国内精品| 国产一区二区三区四区视频| 99在线热播精品免费| 伊人色综合影院| 三妻四妾完整版在线观看电视剧| 欧美日韩国产免费| 美女又爽又黄视频毛茸茸| 99久久www免费| 欧洲日本亚洲国产区| 99热这里只有精品5| 国产亚洲欧美一区在线观看| 成人在线观看www| 成人自拍视频网| 日韩不卡在线观看| 69av视频在线| 久久精品国产一区二区三| 国产综合18久久久久久| 成人影院www在线观看| 91久久精品网| 人妻大战黑人白浆狂泄| 亚洲国内欧美| 91成人在线看| h片在线免费| 欧美亚洲愉拍一区二区| 久久精品老司机| 亚洲裸体俱乐部裸体舞表演av| 91亚洲精华国产精华| av在线免费一区| 91久久精品一区二区三区| 亚洲精品女人久久久| 在线观看的日韩av| 亚洲japanese制服美女| 色影视在线观看| 欧美性色欧美a在线播放| av网站免费在线播放| 亚洲主播在线| 欧美不卡福利| 精品国产第一福利网站| 精品亚洲国产视频| 国内自拍视频在线播放| 91亚洲国产成人精品一区二区三| 国产乱人伦精品一区二区三区| 免费观看性欧美大片无片| 北条麻妃一区二区三区中文字幕 | 乱h高h女3p含苞待放| 免费精品视频在线| 一区二区三区|亚洲午夜| 日本午夜免费一区二区| 中文字幕在线精品| 一级黄色短视频| 1区2区3区精品视频| 久久久久久久高清| 欧美在线首页| 99国产视频在线| 污污网站在线观看| 精品乱人伦一区二区三区| 国产精品suv一区二区69| 成人av在线电影| 久久网站免费视频| 精品无人区麻豆乱码久久久| 国产日韩欧美在线观看| 黄色在线论坛| 日韩精品一区二区三区在线| 精品一区二区三区人妻| 99久久久久久| 精品免费国产一区二区| 久久在线视频| 99久热re在线精品996热视频| xxx性欧美| 国产亚洲精品美女久久久| 姑娘第5集在线观看免费好剧| 国产精品私房写真福利视频| 99九九精品视频| 国产精品www994| 欧美大香线蕉线伊人久久国产精品| sese综合| 久久久91精品国产| 黄色av中文字幕| 欧美影院一区二区三区| 欧洲猛交xxxx乱大交3| 97国产精品videossex| 三级a在线观看| 中国成人一区| 欧美日韩国产免费一区二区三区 | 亚洲女同同性videoxma| 日韩精品久久一区| 日本高清久久| 日韩av免费在线播放| 超碰porn在线| 亚洲欧美国产一区二区三区| 国产精品女同一区二区| 午夜精品久久一牛影视| 亚洲无人区码一码二码三码的含义| 国产一区美女在线| 国产精品第12页| 中文字幕一区二区三区欧美日韩| 鲁鲁视频www一区二区| 国产精品一区二区精品| 全球成人中文在线| 性欧美1819sex性高清大胸| 亚洲女人被黑人巨大进入al| 国产欧美熟妇另类久久久| 色94色欧美sute亚洲线路二| 91视频免费在线看| 中文字幕欧美激情| www.免费av| 国产激情视频一区二区三区欧美| 免费观看成人在线视频| 黄色亚洲免费| 在线视频一二三区| 国产精品一线天粉嫩av| 国产精品伊人日日| 久久天天久久| 国产va免费精品高清在线观看| 91精品久久久| 最近2019中文字幕在线高清| 深夜福利视频一区| 日韩精品自拍偷拍| 一区二区三区亚洲视频| 色999日韩国产欧美一区二区| 日本在线视频免费观看| 亚洲精品成人悠悠色影视| 国产一级淫片久久久片a级| 久久婷婷综合激情| 在线观看亚洲免费视频| 国产精品一二三四五| 岛国av免费在线| 日本女优在线视频一区二区 | 欧美成人精品一区二区男人小说| 久久久久久18| 国产三级伦理在线| 九九热视频这里只有精品| 麻豆影视国产在线观看| 日韩在线观看你懂的| 自拍视频在线| 中文字幕亚洲欧美| 成人精品一区二区三区免费 | 欧美videos大乳护士334| 国产视频一区二区三| 在线电影欧美成精品| 97国产成人无码精品久久久| 欧美日韩国产高清一区二区| 亚洲一级av毛片| 欧美久久久一区| 亚洲综合免费视频| 欧美区在线观看| 一级全黄少妇性色生活片| 欧美性三三影院| 一卡二卡三卡在线观看| 3d动漫精品啪啪一区二区竹菊| ,亚洲人成毛片在线播放| 欧美精品三级日韩久久| 国产精品午夜福利| 91精品午夜视频| 日本三级视频在线| 欧美日韩美女视频| 黄色片网站在线免费观看| 色狠狠综合天天综合综合| 中文精品久久久久人妻不卡| 欧美精选在线播放| 性一交一乱一乱一视频| 亚洲福利视频久久| 天堂av网在线| 中文字幕精品在线视频| 免费黄色电影在线观看| 欧美情侣性视频| 麻豆视频在线观看免费网站黄| 日本精品视频在线播放| 丁香久久综合| 97se在线视频| 亚洲+小说+欧美+激情+另类| 亚洲国产欧美日韩| 欧美aa国产视频| 亚洲美免无码中文字幕在线| 可以免费看不卡的av网站| 一女二男3p波多野结衣| 国产99一区视频免费| 国产一级二级在线观看| 欧美激情一区二区在线| 澳门黄色一级片| 色网站国产精品| 国产女人高潮时对白| 国产午夜精品麻豆| 久久综合之合合综合久久| 国内精品视频一区| 亚洲成人av观看| www.久久艹| 欧美亚洲国产激情| 美女黄色免费看| 免费观看在线综合| 国产视频久久久久久| 国产精品剧情在线亚洲| 日韩 国产 在线| 911精品国产一区二区在线| 亚洲av成人精品一区二区三区在线播放 | 国产视频99| 99精品小视频| 日日摸日日碰夜夜爽av| 国产专区欧美精品| 中文幕无线码中文字蜜桃| 一区二区三区在线观看动漫| 国产第一页在线观看| 精品成a人在线观看| 在线视频二区| 欧洲成人午夜免费大片| 中文字幕一区日韩精品| 亚洲精品在线视频观看| 国产精品乱看| 亚洲国产精品第一页| 国产精品国产三级国产aⅴ原创| 91美女免费看| 精品国产伦理网| 国产在线激情视频| 国产精品99导航| 亚洲三级网址| 久久av高潮av| 国产毛片精品视频| 国产又粗又猛又爽又黄的视频小说| 午夜精品久久久久久久久久久| av加勒比在线| 久久精品福利视频| 国产亚洲欧美日韩精品一区二区三区 | 日韩毛片视频在线看| 亚洲av无码不卡| 亚洲欧美视频在线| 亚洲国产福利| 就去色蜜桃综合| 亚洲作爱视频| 亚洲成av人片在线观看无| 亚洲一区二区三区四区五区黄| 国产剧情精品在线| 久久国产一区二区三区| 福利一区二区免费视频| 日本婷婷久久久久久久久一区二区| 亚洲伦伦在线| 特大黑人巨人吊xxxx| 欧美日韩国产专区| 熟妇人妻一区二区三区四区| 久久久久久中文| 欧美激情久久久久久久久久久| 国产www免费| a在线欧美一区| 国产精品500部| 日韩精品视频在线播放| 神马久久午夜| 蜜桃免费一区二区三区| 欧美亚洲一级| 久久久精品成人| 欧美精选在线播放| 四虎影视国产在线视频| 国产精华一区| 性欧美xxxx大乳国产app| 少妇无套高潮一二三区| 欧美日韩国产色站一区二区三区| 日本福利在线| 999国产在线| 99精品免费视频| 性少妇bbw张开| 欧美日韩国产一级片| 性欧美1819sex性高清大胸| 国产高清一区视频| 亚洲一区久久| 黄大色黄女片18免费| 4438x成人网最大色成网站| 日本高清在线观看视频| 久久久久se| 蜜臂av日日欢夜夜爽一区| 欧洲第一无人区观看| 欧美精品一区二区三区很污很色的| 天堂av在线网| 亚洲免费不卡| 国产不卡在线一区| 无码人妻丰满熟妇奶水区码| 自拍偷拍免费精品| 中文字幕久久精品一区二区 | 亚洲欧洲精品一区二区三区波多野1战4 | 日本高清不卡在线观看| 久久综合之合合综合久久| 国产日韩二区| 久久精品国产亚洲aⅴ| 国产一级在线播放| 亚洲午夜激情免费视频| 亚洲欧洲日韩精品在线| 日本手机在线视频| 亚洲国产精品激情在线观看| www日本在线| 日本亚洲欧洲色α| 欧美成人中文| 色欲狠狠躁天天躁无码中文字幕| 欧美videossexotv100| 蜜桃视频成人m3u8| 国产 日韩 欧美在线| 国产精品毛片久久久久久久| 欧美一级淫片aaaaaa| 国产欧美一区二区| 一本色道久久精品| 三级av在线免费观看| 亚洲欧美日韩天堂一区二区| 亚洲91网站| 99re6在线观看| 色婷婷亚洲精品|