• TypeScript & React(下)


    目录

    TypeScript & React

    TS开发环境的搭建

    tsconfig.json

    webpack.config.js

    babel.config.js

    .eslintrc.js


    TypeScript & React

    TS开发环境的搭建

    • 软件版本:TypeScript:3.9.5;React:16.13.1 Node:8.17.0
    • 环境搭建:正确搭建一个通用的TypeScript开发环境

    差异:

    • tsconfig->babel->eslint

    tsconfig.json

    1. {
    2.   "compilerOptions": {
    3.     "outDir": "./",
    4.     "target": "esnext",
    5.     "allowJs": true,
    6.     "noEmit": true,
    7.     "skipLibCheck": true,
    8.     "esModuleInterop": true,
    9.     "allowSyntheticDefaultImports": true,
    10.     "strict": true,
    11.     "forceConsistentCasingInFileNames": true,
    12.     "module": "esnext",
    13.     "moduleResolution": "node",
    14.     "resolveJsonModule": true,
    15.     "experimentalDecorators": true,
    16.     "noUnusedParameters": true,
    17.     "noUnusedLocals": true,
    18.     "jsx": "react",
    19.     "sourceMap": true,
    20.     "pretty": true,
    21.     "baseUrl": ".",
    22.     "paths": {
    23.       "@/*": [
    24.         "./src/*"
    25.       ]
    26.     },
    27.   },  
    28.   "typeRoots": [
    29.     "node_modules/@types",
    30.     "src/types"
    31.   ],
    32.   "include": [
    33.     "src/**/*"
    34.   ],
    35.   "exclude": [
    36.     "node_modules",
    37.     "dist",
    38.     "**/*.spec.ts"
    39.   ],
    40. }

    webpack.config.js

    1. const path = require('path');
    2. const webpack = require('webpack');
    3. const HtmlWebpackPlugin = require('html-webpack-plugin');
    4. const devPort = parseInt(process.env.port, 10) || 8065;
    5. module.exports = (env) => {
    6.   const publicPath = '';
    7.   const buildPath = './build';
    8.   const config = {
    9.     mode: env.prod ? 'production' : 'development',
    10.     entry: {
    11.       app: path.join(__dirname, './src/index.tsx'),
    12.     },
    13.     devServer: {
    14.       historyApiFallback: true,
    15.       contentBase: path.join(__dirname, buildPath),
    16.       port: devPort,
    17.       hot: true,
    18.       disableHostCheck: true,
    19.     },
    20.     output: {
    21.       path: path.join(__dirname, buildPath),
    22.       pathinfo: true,
    23.       filename: env.prod || env.test ? '[name].[hash].js' : '[name].js',
    24.       publicPath: `${publicPath}/`,
    25.     },
    26.     resolve: {
    27.       alias: {
    28.         '@': path.resolve(__dirname, './src'),
    29.       },
    30.       extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'],
    31.     },
    32.     module: {
    33.       rules: [
    34.         {
    35.           test: /(\.ts|\.tsx)$/,
    36.           exclude: /(node_modules)/,
    37.           use: [
    38.             {
    39.               // 新增支持ts编译
    40.               loader: 'babel-loader',
    41.             },
    42.           ],
    43.         },
    44.         {
    45.           test: /\.css$/,
    46.           exclude: /node_modules/,
    47.           use: [
    48.             {
    49.               loader: 'style-loader',
    50.             },
    51.             {
    52.               loader: 'css-loader',
    53.               options: {
    54.                 importLoaders: 1,
    55.               },
    56.             },
    57.             {
    58.               loader: 'postcss-loader',
    59.             },
    60.           ],
    61.         },
    62.       ],
    63.     },
    64.     plugins: [
    65.       new webpack.DefinePlugin({
    66.         'process.env.ENV': env.dev,
    67.       }),
    68.       new webpack.LoaderOptionsPlugin({ options: {} }),
    69.       new HtmlWebpackPlugin({
    70.         title: 'React & TypeScript',
    71.         template: path.join(__dirname, './src/view/index.html'),
    72.         inject: true,
    73.         hash: false,
    74.         filename: 'index.html',
    75.         publicPath: '',
    76.       }),
    77.     ],
    78.     devtool: 'source-map',
    79.     watch: true,
    80.   };
    81.   return config;
    82. };

    babel.config.js

    1. module.exports = (api) => {
    2.   api.cache(true);
    3.   const plugins = [
    4.     require('@babel/plugin-transform-runtime'),
    5.     [require('@babel/plugin-proposal-decorators'), { legacy: true }],
    6.     [require('@babel/plugin-proposal-class-properties'), { loose: true }],
    7.     require('@babel/plugin-proposal-export-default-from'),
    8.     // require("react-hot-loader/babel"),
    9.   ];
    10.   const presets = [
    11.     [
    12.       require('@babel/preset-env'),
    13.       {
    14.         modules: false,
    15.         useBuiltIns: 'usage',
    16.         corejs: { version: 3, proposals: true },
    17.       },
    18.     ],
    19.     [require('@babel/preset-react')],
    20.     // 插件将ts、tsx转译为js
    21.     [require('@babel/preset-typescript')],
    22.   ];
    23.   return {
    24.     plugins,
    25.     presets,
    26.   };
    27. };

    .eslintrc.js

    1. const path = require('path');
    2. module.exports = {
    3.   root: true,
    4.   // 新增ts的编译
    5.   parser: '@typescript-eslint/parser',
    6.   extends: [
    7.     'airbnb-typescript',
    8.     'airbnb/hooks',
    9.     // 新增tslint推荐
    10.     'plugin:@typescript-eslint/recommended',
    11.     'plugin:@typescript-eslint/recommended-requiring-type-checking',
    12.   ],
    13.   // 新增@typescript-eslint配置项
    14.   plugins: ['@typescript-eslint', 'jsx-a11y', 'import', 'react-hooks'],
    15.   parserOptions: {
    16.     ecmaVersion: 2019,
    17.     sourceType: 'module',
    18.     // 关联ts配置文境
    19.     project: './tsconfig.json',
    20.   },
    21.   settings: {
    22.     'import/resolver': {
    23.       webpack: {
    24.         config: {
    25.           resolve: {
    26.             alias: {
    27.               '@': path.resolve(__dirname, './src'),
    28.             },
    29.             extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'],
    30.           },
    31.         },
    32.       },
    33.     },
    34.   },
    35.   env: {
    36.     browser: true,
    37.   },
    38.   globals: {
    39.     window: true,
    40.     ENV: true,
    41.   },
    42.   rules: {
    43.     indent: ['error', 2],
    44.     quotes: ['error', 'single'],
    45.     semi: ['error', 'always'],
    46.     'no-console': 1,
    47.     'arrow-parens': 0,
    48.     'no-shadow': 'off',
    49.     'react/jsx-filename-extension': 'off',
    50.     'react/jsx-props-no-spreading': 0,
    51.     // 自定义规则
    52.     '@typescript-eslint/consistent-type-definitions': ['error', 'interface'],
    53.     '@typescript-eslint/explicit-function-return-type': 'off',
    54.     '@typescript-eslint/no-explicit-any': 0,
    55.     'import/extensions': [
    56.       'error',
    57.       'ignorePackages',
    58.       {
    59.         ts: 'never',
    60.         tsx: 'never',
    61.         js: 'never',
    62.         jsx: 'never',
    63.         json: 'never',
    64.       },
    65.     ],
    66.     'import/no-unresolved': [2, { commonjs: true, amd: true }],
    67.   },
    68. };

  • 相关阅读:
    Flask 用户登录,表单提交
    (附源码)ssm考试题库管理系统 毕业设计 069043
    Java中的ThreadPoolExecutor
    Linux之 4 种休眠模式
    SQLAlchemy的使用
    设计模式-职责链模式
    4、K8s控制器-Replicaset
    Docker部署 Nacos
    LeetCode地平线专场——第308场周赛题解
    计算机网络(七)——TCP(下)
  • 原文地址:https://blog.csdn.net/qq_35729091/article/details/133701292