国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

從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

2015-11-23 09:50:15

JavaScript模塊化SeaJs

2020-05-12 08:39:50

JavaScript工具技術

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

2017-05-18 10:23:55

模塊化開發RequireJsJavascript

2013-08-20 15:31:18

前端模塊化

2020-09-17 10:30:21

前端模塊化組件

2022-03-11 13:01:27

前端模塊

2015-10-10 11:29:45

Java模塊化系統初探

2020-09-18 09:02:32

前端模塊化

2011-12-21 16:08:43

2021-12-24 07:10:36

架構分層模塊化

2021-12-02 05:57:04

模塊化UPS電源

2021-06-10 18:40:32

ES 標準模塊化

2015-12-11 15:51:36

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

51CTO技術棧公眾號

成人免费看视频| 国产劲爆久久| 国产成人无码精品久久久性色| 91久久久久久久久| 簧片在线免费看| 91成人精品在线| 国产91精品欧美| 亚洲电影免费观看高清完整版在线观看| 精品国产免费一区二区三区| 番号在线播放| 香蕉国产精品偷在线观看不卡| 日韩一区二区三区电影在线观看| 欧美精品成人一区二区在线观看| 秋霞a级毛片在线看| 久久久久国产精品| 欧美日韩精品国产| 国产精品播放| 一二三四社区在线视频6| 国产剧情在线观看一区| 色综合天天综合色综合av| 国产精品久久久久免费 | 日韩精品电影| 欧美性一区二区| 一区精品视频| 亚洲第一二区| 精品久久在线播放| 日韩精品欧美一区二区三区| 欧美性理论片在线观看片免费| 99久久精品免费看国产免费软件| 隔壁老王国产在线精品| 91欧洲在线视精品在亚洲| 欧美淫片网站| 亚洲热线99精品视频| 黄色永久免费网站| 欧美hentaied在线观看| 欧美一区二区三区喷汁尤物| 300部国产真实乱| 久久精品色播| 日本韩国欧美一区| 伊人久久在线观看| 成人综合婷婷国产精品久久蜜臀 | 日韩一区二区免费看| 中文字幕亚洲综合久久筱田步美| 91麻豆福利| 久久aⅴ国产紧身牛仔裤| 久久中国妇女中文字幕| 亚洲综合色视频在线观看| 免费视频一区二区| 欧美激情精品久久久久久大尺度 | 亚洲欧洲www| 你懂的网址一区二区三区| 精品久久福利| 色婷婷亚洲精品| 国产欧美黑人| 最新成人av在线| 四虎影院在线播放| 91丨porny丨蝌蚪视频| av在线亚洲男人的天堂| 亚州精品国产| 欧美三级中文字幕| 成人观看网站a| 免费看欧美美女黄的网站| 喜爱夜蒲2在线| 亚洲日本丝袜连裤袜办公室| 亚洲一区三区视频在线观看| 成人在线免费观看91| 中文字幕一区二区精品| 久久精品亚洲成在人线av网址| 国产伦精品一区二区三毛| 成人免费视频网站在线观看| 中国在线观看免费国语版电影| 欧美大胆人体bbbb| 在线观看视频污| 精品久久久久久久久久久久久久久久久| 日本视频一二三区中文字幕| 国产一区二区视频在线播放| 亚洲bt天天射| 亚洲精品456| 最新国产精品拍自在线播放| 国产鲁鲁视频在线观看免费| 在线观看久久久久久| 日本无删减在线| 午夜精品久久久久久久久久久| 各处沟厕大尺度偷拍女厕嘘嘘| 日韩精品福利网| 亚洲aaaaaa| 成人a免费在线看| 免费h精品视频在线播放| 国产福利精品一区| 日本丰满大乳奶| 国产欧美一区二区色老头| 91精品国产91久久| 亚洲码欧美码一区二区三区| 国产福利久久精品| 国产精品美女久久久久久| 欧美日本视频在线观看| 色婷婷亚洲精品| 试看120秒一区二区三区| 亚洲 日韩 国产第一区| 一区二区亚洲| 国产一区二区久久久| 亚洲小说欧美另类社区| 中文字幕乱码人妻综合二区三区| 国产激情视频一区二区三区欧美| 国产精品对白久久久久粗| 这里只有视频精品| 亚洲小说欧美另类社区| 91大神影片| 久久激情视频久久| 欧美xxx视频| 亚洲精品在线91| 欧美成人性网| 国产精品欧美久久| 亚洲综合免费观看高清完整版 | a91a精品视频在线观看| 天天色综合6| 一区二区在线观看免费 | 欧美中文在线观看| 精品国产91久久久久久浪潮蜜月| 午夜精品一区二区三区在线| 欧美黑人做爰爽爽爽| 国产精品夜间视频香蕉| 国产精品美女久久久久久不卡 | 欧美日韩成人精品| 曰本一区二区三区视频| 男人添女人下面高潮视频| 亚洲人成网站999久久久综合| 日韩va亚洲va欧美va久久| 高清国语自产拍免费一区二区三区| 国产精品美女久久久久久| 久久免费精品| 国产精品高潮在线| 日韩激情在线| 加勒比在线日本| 精品久久久久久久久久| aaa国产精品视频| 成人网址在线观看| 免费在线亚洲| 免费大片黄在线观看视频网站| 久久99精品久久久久久秒播放器| 久久精品国产秦先生| 日韩毛片在线免费看| 亚洲成av人片www| 色综合中文网| 欧美精品在线一区| 欧美性生活大片免费观看网址| 久久精品二区三区| 国产在线观看高清视频| 欧美日韩国产小视频| 草草在线视频| 久久av红桃一区二区小说| 成人高清视频免费观看| 欧美高清免费| 色诱视频在线观看| 欧美激情精品久久久久久大尺度| 久久―日本道色综合久久| 蜜桃视频免费网站| 国产精品扒开腿做爽爽爽的视频| 亚洲综合视频在线| 一区二区三区四区日韩| 国产 欧美 日本| 国产精品久久网站| 日韩aaa久久蜜桃av| 毛片视频免费| 91久久久一线二线三线品牌| 狠狠色丁香婷综合久久| 成全视频全集| 91九色单男在线观看| 欧美日韩不卡在线| 国产真实乱对白精彩久久| 精品国产伦一区二区三区观看说明 | 久久全国免费视频| 午夜精品福利一区二区三区av | 99福利在线| 国内偷自视频区视频综合| 一区二区高清视频在线观看| 精久久久久久| 香蕉伊大人中文在线观看| 99re资源| 亚洲深夜福利网站| 亚洲欧美一区二区视频| 欧美特黄a级高清免费大片a级| 欧美黄色一级片视频| 国产欧美日韩中文| 91看片淫黄大片一级| 奇米色欧美一区二区三区| 免费的黄网站在线观看| 日韩视频在线免费看| 懂色中文一区二区三区在线视频| 国产偷国产偷亚洲清高网站| 玉米视频成人免费看| 欧美96一区二区免费视频| 日本久久成人网| 成人三级高清视频在线看| 能在线观看av网站| 亚洲av首页在线| 99国产高清| 97香蕉久久夜色精品国产| 欧美刺激脚交jootjob| 亚洲自拍另类综合|