tomli 2020-05-25
1、创建使用ts的新项目
yarn create react-app my-test-app --template typescript
2、配置tsconfig.json
(1)在根目录下新建文件tsconfig.extend.json
{ "compilerOptions": { "baseUrl": "src", "paths": { "@/*": ["./*"] } } } (2)在tsconfig.json中新增 "extends": "./tsconfig.extend.json" (3)允许装饰器语法 "experimentalDecorators": true 3、安装依赖 (1)yarn add antd (2)安装craco以覆盖webpack配置 yarn add @craco/craco 修改package.json "scripts": { "start": "craco start", "build": "craco build", "test": "craco test" }, (3)安装其他craco插件 yarn add craco-antd yarn add craco-less yarn add craco-alias (4)在根目录下新建craco.config.js文件 const CracoAntDesignPlugin = require("craco-antd"); const CracoAlias = require("craco-alias"); const CracoLessPlugin = require("craco-less"); const path = require(‘path‘); module.exports = { plugins: [ /* antd组件按需加载&样式覆盖等 */ { plugin: CracoAntDesignPlugin, options: { customizeThemeLessPath: path.join( __dirname, "src/styles/antd.theme.less" ), }, }, /* 支持less module */ { plugin: CracoLessPlugin, options: { cssLoaderOptions: { modules: { localIdentName: "[local]_[hash:base64:5]" }, }, 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) => { return { ...devServerConfig, // 服务开启gzip compress: true, proxy: { ‘/api‘: { target: ‘https://dolphin-test.cootekos.com/‘, changeOrigin: true, xfwd: false, } } } } }; (5)在react-app-env.d.ts文件中新增(否则将无法正常使用less module!!!) /* 允许在ts中使用import styles from ‘*.less‘ */ declare module ‘*.less‘ { const styles: any; export = styles; } (6)安装eslint yarn add eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin eslint-config-airbnb eslint-import-resolver-typescript eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-react eslint-plugin-react-hooks --dev 在根目录下新建.eslintrc.js 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": [2, { "extensions": [".js", ".jsx", "ts", "tsx"] }], "@typescript-eslint/explicit-function-return-type": [0, { allowTypedFunctionExpressions: true }], "react/state-in-constructor": 0, "import/extensions": [2, ‘ignorePackages‘, { ts: ‘never‘, tsx: ‘never‘, json: ‘never‘, js: ‘never‘ }], "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" } }, }, }; (7)prettier yarn add prettier eslint-config-prettier eslint-plugin-prettier -D 在根目录下新建.prettierrc.js module.exports = { "semi": true, "singleQuote": true, "trailingComma": "es5", "tabWidth": 2, "useTabs": false }; 修改.eslintrc.js extends: [ ... ‘prettier/@typescript-eslint‘, ‘plugin:prettier/recommended‘ ], (8)stylelint yarn add stylelint stylelint-config-recommended stylelint-config-recess-order stylelint-config-standard -D 在根目录下新建.stylelintrc.json { "extends": [ "stylelint-config-recommended", "stylelint-config-recess-order", "stylelint-config-standard" ], "rules": { "indentation": 2, "selector-pseudo-class-no-unknown": [ true, { "ignorePseudoClasses": ["global"] } ] } } (9)增加pre-commit yarn add pre-commit --dev yarn add lint-staged --dev 修改package.json的scripts "lint": "eslint src --fix --ext .ts,.tsx", "lint-staged": "lint-staged"
"lint-staged": { "**/*.{ts,tsx,less}": [ "prettier --write" ], "**/*.{ts,tsx}": "yarn lint", "**/*.less": "stylelint --syntax less" }, "husky": { "hooks": { "pre-commit": "yarn lint-staged" } }
运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算。以上实例中 7、5 和 12 是操作数。关系运算符用于计算结果是否为 true 或者 false。逻辑运算符用于测定变量或值之间的逻辑。