gulp构建react+typescript项目十一:构建、检查tsx

本文主要对以下部分进行处理;

  1. 构建tsx
  2. 路径映射
  3. eslint检查tsx

一、构建tsx

1、安装相关依赖,本文选择tsify插件来解析tsx,tsify会根据tsconfig.json配置来解析tsx,传送门:https://www.npmjs.com/package...

cnpm i -D tsify

2、构建脚本

const _script = () => {
  return browserify({
      entries: _path.main_js,
      debug: isDev, // 生成inline-sourcemap
    }).plugin(tsify)
    .transform(babelify, {
      presets: ['@babel/preset-env', '@babel/preset-react'],
      plugins: [
        '@babel/plugin-transform-runtime', 
        ['@babel/plugin-proposal-decorators', { 'legacy': true }], 
        ['@babel/plugin-proposal-class-properties', { 'loose': true }]
      ]
    })
    .bundle()
    .pipe(gulpif(isDev, exorcist(path.resolve(__dirname, 'dist/js/app.js.map')))) // 生成外部map
    .pipe(source('app.js'))
    .pipe(buffer())
    .pipe(gulpif(isProd, uglify()))
    .pipe(gulpif(isProd, rename({suffix: '.min'})))
    .pipe(gulp.dest('./dist/js'))
    .pipe(gulpif(isDev, connect.reload()));
};

3、tsconfig.json配置

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "jsx": "react",
    "strict": true,
    "noImplicitAny": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  }
}

二、路径映射

路径映射需要配置两个地方,构建脚本和tsconfig.json,因为执行构建脚本时他并不知道tsconfig.json当中的路径配置,所以两个地方都需要统一配置。
1、tsconfig.json加上路径映射

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "jsx": "react",
    "strict": true,
    "noImplicitAny": true,
    "baseUrl": ".",
    "paths": {
      "components/*": ["./src/components/*"]
    }, 
    "rootDirs": ["./src"],
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  }
}

2、browserify配置对象的paths属性可以设置搜索的目录
传送门:https://github.com/browserify...

const _script = () => {
  return browserify({
      entries: _path.main_js,
      debug: isDev, // 生成inline-sourcemap
      extensions: ['.js', '.jsx', 'tsx', '.json'],
      paths: ['./src/'], // 是目录的数组,当查找未使用相对路径引用的模块时,浏览器会搜索这些目录。可以是绝对的,也可以是相对的basedir。等效于NODE_PATH调用browserify命令时设置环境变量。
    }).plugin(tsify)
    .transform(babelify, {
      presets: ['@babel/preset-env', '@babel/preset-react'],
      plugins: [
        '@babel/plugin-transform-runtime', 
        ['@babel/plugin-proposal-decorators', { 'legacy': true }], 
        ['@babel/plugin-proposal-class-properties', { 'loose': true }]
      ]
    })
    .bundle()
    .pipe(gulpif(isDev, exorcist(path.resolve(__dirname, 'dist/js/app.js.map')))) // 生成外部map
    .pipe(source('app.js'))
    .pipe(buffer())
    .pipe(gulpif(isProd, uglify()))
    .pipe(gulpif(isProd, rename({suffix: '.min'})))
    .pipe(gulp.dest('./dist/js'))
    .pipe(gulpif(isDev, connect.reload()));
};

注意:paths和config.json中路径配置应该保持一致,不然编译或者构建时会报错。

三、eslint检查tsx

1、安装相关依赖

cnpm i -D @typescript-eslint/parser eslint-plugin-typescript eslint-plugin-react-hooks eslint-plugin-jsx-a11y

@typescript-eslint/parserESLint解析器,它利用TypeScript ESTree允许ESLint整理TypeScript源代码

eslint-plugin-typescriptTypeScript代码库提供lint规则

eslint-plugin-react-hooksreact hooks提供lint规则

eslint-plugin-jsx-a11y静态AST检查器,用于JSX元素上的可访问性规则

2、.eslintrc.js配置

/* eslint-disable */
module.exports = {
    "env": {
        "browser": true,
        "es2020": true,
        "node": true
    },
    "extends": [
        "eslint:recommended",
        "plugin:react/recommended",
        "plugin:@typescript-eslint/recommended",
        "plugin:react-hooks/recommended",
        "plugin:jsx-a11y/recommended",
    ],
    "parser": "@typescript-eslint/parser", // ESLint解析器,它利用TypeScript ESTree允许ESLint整理TypeScript源代码
    "parserOptions": {
        "ecmaFeatures": {
            "experimentalObjectRestSpread": true, // 启用实验室特性
            "jsx": true
        },
        "ecmaVersion": 11,
        "sourceType": "module"
    },
    "plugins": [
        "react",
        "@typescript-eslint", // 为TypeScript代码库提供lint规则
        "react-hooks", // 为react hooks提供规则
        "jsx-a11y", // 静态AST检查器,用于JSX元素上的可访问性规则。
    ],
    "rules": {
        "@typescript-eslint/explicit-module-boundary-types": "off", // 返回值不需要定义类型
        "@typescript-eslint/ban-types": "off",
        "@typescript-eslint/no-var-requires": "off",
    },
    "settings": {
        "react": {
            "version": "detect" // 自动选择您安装的版本
        }
    }
};

3、vscode 首选项-setting.json
监听js、jsx、ts、tsx文件

  "eslint.validate": [
    "javascript",
    "javascriptreact",
    "typescript",
    "typescriptreact"
  ]

demo地址:https://github.com/Revelation...

参考:
https://szhshp.org/tech/2020/...

阅读 314

推荐阅读