金生金世 發表於 2020-5-25 14:51:00

create-react-app + Typescript脚手架搭建

<p class="p1">1、创建使用ts的新项目</p>
<p class="p1">yarn create react-app my-test-app --template typescript</p>
<p class="p1">&nbsp;</p>
<p class="p1">2、配置tsconfig.json</p>
<p class="p1">(1)在根目录下新建文件tsconfig.extend.json</p>
<div>
<div>
<div class="cnblogs_Highlighter">
<pre class="brush:javascript;gutter:true;">{
"compilerOptions": {
    "baseUrl": "src",
    "paths": {
      "@/*": ["./*"]
    }
}
}
</pre>
</div>
<p>  </p>
</div>
<div>(2)在tsconfig.json中新增</div>
<div>
<div class="cnblogs_Highlighter">
<pre class="brush:javascript;gutter:true;">"extends": "./tsconfig.extend.json"
</pre>
</div>
<p>&nbsp;</p>
<p>(3)允许装饰器语法</p>
<div class="cnblogs_Highlighter">
<pre class="brush:javascript;gutter:true;">"experimentalDecorators": true
</pre>
</div>
<p>  </p>
</div>
</div>
<p class="p1">3、安装依赖</p>
<p class="p1">(1)yarn add antd</p>
<p class="p1">(2)安装craco以覆盖webpack配置</p>
<p class="p1">yarn add @craco/craco</p>
<div>修改package.json</div>
<div>
<div class="cnblogs_Highlighter">
<pre class="brush:javascript;gutter:true;">"scripts": {
"start": "craco start",
"build": "craco build",
"test": "craco test"
},
</pre>
</div>
<p>  </p>
</div>
<p class="p1">(3)安装其他craco插件</p>
<p class="p1">yarn add craco-antd</p>
<p class="p1">yarn add craco-less</p>
<p class="p1">yarn add craco-alias</p>
<p class="p1">(4)在根目录下新建craco.config.js文件</p>
<div class="cnblogs_Highlighter">
<pre class="brush:javascript;gutter:true;">const CracoAntDesignPlugin = require("craco-antd");
const CracoAlias = require("craco-alias");
const CracoLessPlugin = require("craco-less");

const path = require('path');

module.exports = {
plugins: [
    /* antd组件按需加载&amp;样式覆盖等 */
    {
      plugin: CracoAntDesignPlugin,
      options: {
      customizeThemeLessPath: path.join(
          __dirname,
          "src/styles/antd.theme.less"
      ),
      },
    },
    /* 支持less module */
    {
      plugin: CracoLessPlugin,
      options: {
      cssLoaderOptions: {
          modules: { localIdentName: "_" },
      },
      modifyLessRule: function(lessRule, _context) {
          lessRule.test = /\.(module)\.(less)$/;
          lessRule.exclude = path.join(__dirname, 'node_modules');
          return lessRule;
      },
      },
    },
    /* 别名设置 */
    {
      plugin: CracoAlias,
      options: {
      source: "tsconfig",
      baseUrl: "./src",
      tsConfigPath: "./tsconfig.extend.json"
      }
    },
],
devServer: (devServerConfig) =&gt; {
    return {
      ...devServerConfig,
      // 服务开启gzip
      compress: true,
      proxy: {
      '/api': {
          target: 'https://test.com/',
          changeOrigin: true,
          xfwd: false,
      }
      }
    }
}
};
</pre>
</div>
<p>(5)在react-app-env.d.ts文件中新增(否则将无法正常使用less module!!!)</p>
<div class="cnblogs_Highlighter">
<pre class="brush:javascript;gutter:true;">/* 允许在ts中使用import styles from '*.less' */
declare module '*.less' {
const styles: any;
export = styles;
}
</pre>
</div>
<p>(6)安装eslint</p>
<p>yarn add eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin&nbsp;eslint-config-airbnb&nbsp;eslint-import-resolver-typescript&nbsp;eslint-plugin-import&nbsp;eslint-plugin-jsx-a11y&nbsp;eslint-plugin-react&nbsp;eslint-plugin-react-hooks&nbsp;--dev</p>
<p>在根目录下新建.eslintrc.js</p>
<div class="cnblogs_Highlighter">
<pre class="brush:javascript;gutter:true;">module.exports = {
env: {
    browser: true,
    es6: true,
},
extends: [
    'plugin:react/recommended',
    'plugin:@typescript-eslint/recommended',
    'airbnb',
    'airbnb/hooks',
],
parser: '@typescript-eslint/parser',
parserOptions: {
    ecmaFeatures: {
      jsx: true,
      tsx: true,
      modules: true
    },
    ecmaVersion: 2020,
    sourceType: 'module',
},
plugins: [
    'react',
    '@typescript-eslint',
],
rules: {
    "react/jsx-filename-extension": }],
    "@typescript-eslint/explicit-function-return-type": ,
    "react/state-in-constructor": 0,
    "import/extensions": ,
    "jsx-a11y/click-events-have-key-events": 0,
    "jsx-a11y/no-static-element-interactions": 0,
    "react/jsx-props-no-spreading": 0,
    "no-unused-expressions": 0,
    "jsx-a11y/anchor-is-valid": 0,
    "no-nested-ternary": 0,
    "react/static-property-placement": 0,
    "object-curly-newline": 0,
},
settings: {
    "import/resolver": {
      node: {
      extensions: [".js", ".jsx", ".ts", ".tsx"]
      },
      typescript: {
      directory: "./tsconfig.json"
      }
    },
},
};
</pre>
</div>
<p>(7)prettier</p>
<div>
<p>yarn add prettier eslint-config-prettier eslint-plugin-prettier -D</p>
<p>在根目录下新建.prettierrc.js</p>
<div class="cnblogs_Highlighter">
<pre class="brush:javascript;gutter:true;">module.exports ={
"semi": true,
"singleQuote": true,
"trailingComma": "es5",
"tabWidth": 2,
"useTabs": false
};
</pre>
</div>
<p>修改.eslintrc.js</p>
<div class="cnblogs_Highlighter">
<pre class="brush:javascript;gutter:true;">extends: [
    ...
    'prettier/@typescript-eslint',
    'plugin:prettier/recommended'
],
</pre>
</div>
<p>(8)stylelint</p>
<p>yarn add stylelint stylelint-config-recommended&nbsp;stylelint-config-recess-order&nbsp;stylelint-config-standard -D</p>
<p>在根目录下新建.stylelintrc.json</p>
<div class="cnblogs_Highlighter">
<pre class="brush:javascript;gutter:true;">{
"extends": [
    "stylelint-config-recommended",<br>    "stylelint-config-recess-order",
    "stylelint-config-standard"
],
"rules": {
    "indentation": 2,
    "selector-pseudo-class-no-unknown": [ true, { "ignorePseudoClasses": ["global"] } ]
}
}
</pre>
</div>
<p>&nbsp;</p>
<p>(9)增加pre-commit</p>
<p>yarn add pre-commit --dev</p>
<p>yarn add lint-staged --dev</p>
<div>修改package.json的scripts</div>
<div>
<div class="cnblogs_Highlighter">
<pre class="brush:javascript;gutter:true;">"lint": "eslint src --fix --ext .ts,.tsx",
"lint-staged": "lint-staged"</pre>
</div>
</div>
<div>在package.json增加</div>
<div>
<div class="cnblogs_Highlighter">
<pre class="brush:javascript;gutter:true;">"lint-staged": {
    "**/*.{ts,tsx,less}": [
      "prettier --write"
    ],
    "**/*.{ts,tsx}": "yarn lint",
    "**/*.less": "stylelint --syntax less"
},
"husky": {
    "hooks": {
      "pre-commit": "yarn lint-staged"
    }
}
</pre>
</div>
<p>  </p>
</div>
</div><br><br>
来源:https://www.cnblogs.com/jessicaDuan/p/12955363.html
頁: [1]
查看完整版本: create-react-app + Typescript脚手架搭建