項目重構體驗一二三

前言

不知不覺月底了,都有點不知道本身在忙啥!javascript


最近在重構原來的項目,把一個項目分紅了三個項目。 一個socket的BFF,一個http的BFF,固然還有一個就是純UI項目。html


BFF層

拆分後的項目都採用的是TypeScript重寫的。
http的BFF和scoket的BFF自己太多說的, http的BFF除了使用http-proxy-middle中間件外,也沒什麼,也許有人就說,你這個其餘使用nginx就完事了。 這個家家有本難唸的經。 由於這個http的BFF有權限檢查,數據聚合,數據過濾,第三方API等請求。java

此外,惟一要說的就是tslint,由於tslint要逐漸退出歷史的舞臺了。 咱們使用eslint來檢查typescipt。 這就的安裝@typescript-eslint/parser@typescript-eslint/eslint-plugin
最後大體的樣子就是node

{
    "extends": [
        "airbnb-base",
        "plugin:@typescript-eslint/recommended"
    ],
    "parser": "@typescript-eslint/parser",
    "plugins": [
        "@typescript-eslint"
    ],
    "settings": {
        "import/resolver": {
            "node": {
                "extensions": [
                    ".ts",
                    ".js"
                ]
            }
        }
    },
    "rules": {   
        
    },
    "globals": {
        "document": false
    },
  
}

能夠看到,上面採用的eslint-config-airbnb-base規則集合,另外TypeScript也是有本身的規則的,具體的規則能夠在https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/eslint-plugin/docs/rules看到。 而關於airbnb的規則能夠到https://github.com/airbnb/javascripthttps://eslint.org/docs/rules/ 去查看。react


eslint-config-airbnb-baseeslint-config-airbnb規則集是有很大區別的,本身去百度哈。webpack


具體參考:nginx

@typescript-eslint/eslint-plugin
VScode下搭配ESLint、typescript-eslint的代碼檢查配方
ESLint+Prettier統一TypeScript代碼風格git

UI項目 (webpack + react + typescript)

在UI項目重構中,遇到的問題就要多一些啦。github

TypeScript 中使用Web Woker

出定義一個自定義模塊, 編寫worker, 外部引用。web

// typings/custom.d.ts
declare module "worker-loader!*" {
  class WebpackWorker extends Worker {
    constructor();
  }

  export default WebpackWorker;
}
}
// Worker.ts
const ctx: Worker = self as any;

// Post data to parent thread
ctx.postMessage({ foo: "foo" });

// Respond to message from parent thread
ctx.addEventListener("message", (event) => console.log(event));
// App.ts
import Worker from "worker-loader!./Worker";

const worker = new Worker();

worker.postMessage({ a: 1 });
worker.onmessage = (event) => {};

worker.addEventListener("message", (event) => {});

參考

worker-loader

TypeScript 分包

大體思路是第三方庫分離成一個vendor,經常使用的工具或者組件分離爲一個common。固然你能夠使用test屬性來自定義。

{
    mode: "production",
    plugins: [htmlStringReplacePlugin, optimizeCssAssetsPlugin],
    optimization: {
        minimize: true,
        splitChunks: {
            automaticNameDelimiter: "-",
            cacheGroups: {
                vender: {
                    name: false,
                    enforce: true, // ignore splitChunks.minSize, splitChunks.minChunks, splitChunks.maxAsyncRequests and splitChunks.maxInitialRequests
                    test: /[\\/]node_modules[\\/]/,
                    chunks: "all",
                    priority: 10,
                    filename: "vender.[hash].js"
                },
                common: {
                    name: false,
                    minChunks: 2,
                    minSize: 0,
                    filename: "common.[hash].js"
                }
            }
        }
    }
};

其次,咱們要對路由進行動態加載, 在新版本的React,已經支持React.lazy。
webpack有專門的guid Lazy-loading, 可是,不生效的。

TypeScript 開發總結做者有提到

compilerOptions: {
        module: "esnext",
    },

這裏就要牽扯到 loader的執行順序呢。

算了,完了,先休息啦。

相關文章
相關標籤/搜索