欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談TypeScript 用 Webpack/ts-node 運(yùn)行的配置記錄

 更新時(shí)間:2019年10月11日 15:25:14   作者:題葉  
這篇文章主要介紹了淺談TypeScript 用 Webpack/ts-node 運(yùn)行的配置記錄,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

公司項(xiàng)目代碼是用 TypeScript 寫的, 中間遇到有些代碼不要放到 Node 里面去跑.

具體場景一些路由配置, 比較大的一塊 JSON 數(shù)據(jù)定義在 TypeScript 里.

我另外有增加腳本, 基于這些 JSON 數(shù)據(jù)用來生成切換路由的函數(shù).

這就需要運(yùn)行 TypeScript 了, 而且可能包含一些額外的業(yè)務(wù)代碼.

首先 Node 運(yùn)行 TypeScript 有提供 ts-node 用來處理.

ts-node 會(huì)先編譯 TypeScript 代碼到 JavaScript, 再調(diào)用 Node 運(yùn)行.

不過這個(gè)辦法有一些問題, 一個(gè)是 TypeScript 定義的路徑配置不成功,

另一個(gè)問題更麻煩點(diǎn), 就是引用到的其他的瀏覽器端代碼因?yàn)橛|發(fā)運(yùn)行而引起報(bào)錯(cuò).

Webpack 打包 TypeScript Node 代碼

我先想到了一個(gè)相對省事的方案, 就是用 Webpack 對 TypeScript 進(jìn)行打包.

打包完成以后輸出 JavaScript 代碼. 而瀏覽器代碼打包進(jìn)去, 但不一定運(yùn)行.

由于 TypeScript 配置在 Webpack 當(dāng)中引用有比較成熟的方案, 整個(gè)配置也寫好:

module.exports = {
 mode: "development",
 target: "node",
 entry: ["./example/gen-router.ts"],
 output: {
  filename: "gen-router.js",
  path: path.join(__dirname, "../", distFolder),
 },
 devtool: "none",
 module: {
  rules: [
   // 正常的 TypeScript 編譯方式, 我這份是拷貝的.
   {
    test: /\.tsx?$/,
    exclude: [/node_modules/, path.join(__dirname, "scripts")],
    use: [
     { loader: "cache-loader" },
     {
      loader: "thread-loader",
      options: {
       workers: require("os").cpus().length - 1,
      },
     },
     {
      loader: "ts-loader",
      options: {
       happyPackMode: true,
       transpileOnly: true,
      },
     },
    ],
   },
  ],
 },
 // Node 模塊, 寫在 external 里面表明不需要進(jìn)行打包. 注意 commonjs 前綴
 externals: {
  prettier: "commonjs prettier",
  "@jimengio/router-code-generator": "commonjs @jimengio/router-code-generator",
  fs: "commonjs fs",
  path: "commonjs path",
 },
 resolve: {
  extensions: [".tsx", ".ts", ".js"],
  modules: [path.join(__dirname, "example"), "node_modules"],

  // 引用 Plugin 用于讀取 tsconfig.json 文件的配置
  plugins: [new TsconfigPathsPlugin({ configFile: path.join(__dirname, "../tsconfig.json") })],
 },
};

基于這個(gè)配置打包以后, TypeScript 的代碼被打包好, 并且引用響應(yīng)的 Node 模塊.

運(yùn)行就滿足需求了.

這個(gè)方式對于其他的服務(wù)端渲染的 TypeScript 代碼打包也是類似的.

一些特殊的依賴如果不好處理, 可以放在 Webpack 當(dāng)中進(jìn)行打包和映射, 得到 js.

ts-node 運(yùn)行

Webpack 配置相對直接運(yùn)行 TypeScript 來說會(huì)復(fù)雜一點(diǎn), 所以還是 ts-node 簡單.

在依賴少的項(xiàng)目當(dāng)中, 我改成了用 ts-node 來進(jìn)行編譯運(yùn)行. 配置如下

{
 "compilerOptions": {
  "allowSyntheticDefaultImports": true,
  "experimentalDecorators": true,
  "sourceMap": true,
  "noImplicitAny": false,
  "noImplicitThis": true,
  "strictNullChecks": false,
  "moduleResolution": "node",

  // Node 當(dāng)前還沒有支持直接運(yùn)行 import/export 語法, 需要編譯到 CommonJS
  "module": "commonjs",

  "target": "es2016",
  "jsx": "react",
  "lib": ["es2016"],
  "types": ["node"],
  "baseUrl": "./example/",
  "paths": {
   "models": ["./example/models"]
  },
  "plugins": []
 }
}

其實(shí)主要修改就 commonjs 那一行, 然后就是加上參數(shù)運(yùn)行

ts-node -P tsconfig-node.json -r tsconfig-paths/register example/gen-router.ts

注意命令當(dāng)中的 tsconfig-paths. 這里的 -r 是指定 register.

ts-node 是先進(jìn)行編譯再運(yùn)行的, 但是引用的路徑?jīng)]有全都替換掉.

比如我在 tsconfig.json 里設(shè)置了 baseUrl 然后內(nèi)部引用是簡寫的, a/b/c,

拿到 Node 本身去運(yùn)行的時(shí)候是不知道這個(gè) a/b/c 對應(yīng)到哪里,

所以 tsconfig-paths/register 就提供 Node 運(yùn)行時(shí)的方案, 動(dòng)態(tài)查找依賴.

至少這樣 Node register 改寫以后, 查找模塊就能正確進(jìn)行了.

其他

另外 TypeScript 編譯 import 語法時(shí)會(huì)產(chǎn)生一個(gè) .default 屬性.

對于 CommonJS 的模塊, 這個(gè) .default 屬性是多余的. 所以引用的寫法要做調(diào)整.

import * as fs from "fs";
import * as path from "path";
import * as prettier from "prettier";

這個(gè)可能跟 tsconfig.json 里其他的配置有關(guān)聯(lián), 我沒繼續(xù)深挖.

整體的代碼參考 https://github.com/jimengio/meson-form/pull/62/files

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論