寂静的雾雨 發表於 2020-12-8 22:53:00

使用create-react-app搭建TypeScript+React+Ant Design开发环境

<h3>一、使用create-react-app创建一个支持TypeScript+React的开发环境:</h3>
<p>要创建一个支持TypeScript的Create React App项目,可以运行:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="14">
<pre class="cke_widget_element" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;javascript&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;npx create-react-app my-app --template typescript\n\n# or\n\nyarn create react-app my-app --template typescript&amp;quot;,&amp;quot;classes&amp;quot;:[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-javascript hljs">npx create-react-app my-app --template typescript

# or

yarn create react-app my-app --template typescript</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img width="15" height="15" class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>要将TypeScript添加到已有的Create React App项目,请先安装它:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="13">
<pre class="cke_widget_element" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;javascript&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;npm install --save typescript @types/node @types/react @types/react-dom @types/jest\n\n# or\n\nyarn add typescript @types/node @types/react @types/react-dom @types/jest&amp;quot;,&amp;quot;classes&amp;quot;:[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-javascript hljs">npm install --save typescript @types/node @types/react @types/react-dom @types/jest

# or

yarn add typescript @types/node @types/react @types/react-dom @types/jest</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img width="15" height="15" class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>接下来,将文件重命名为TypeScript文件(例如src/索引.js至src/索引.tsx),重新启动开发服务器!</p>
<h3>二、使用create-react-app搭建TypeScript+React+Ant Design开发环境:</h3>
<p><strong>安装和初始化</strong></p>
<p>请确保电脑上已经安装了最新版的 yarn 或者 npm。</p>
<p>使用 yarn 创建 cra-template-typescript 项目。</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="12">
<pre class="cke_widget_element" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;javascript&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;$ yarn create react-app antd-demo-ts --template typescript&amp;quot;,&amp;quot;classes&amp;quot;:[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-javascript hljs">$ yarn create react-app antd-demo-ts --template typescript</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img width="15" height="15" class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>如果你使用的是 npm(接下来我们都会用 yarn 作为例子,如果你习惯用 npm 也没问题)。</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="11">
<pre class="cke_widget_element" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;javascript&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;$ npx create-react-app antd-demo-ts --typescript&amp;quot;,&amp;quot;classes&amp;quot;:[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-javascript hljs">$ npx create-react-app antd-demo-ts --typescript</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img width="15" height="15" class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>然后我们进入项目并启动。</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="10">
<pre class="cke_widget_element" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;javascript&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;$ cd antd-demo-ts\n$ yarn start&amp;quot;,&amp;quot;classes&amp;quot;:[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-javascript hljs">$ cd antd-demo-ts
$ yarn start</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img width="15" height="15" class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>此时浏览器会访问 http://localhost:3000/ ,看到 Welcome to React 的界面就算成功了。</p>
<p><strong>引入 antd</strong></p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="9">
<pre class="cke_widget_element" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;javascript&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;$ yarn add antd&amp;quot;,&amp;quot;classes&amp;quot;:[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-javascript hljs">$ yarn add antd</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img width="15" height="15" class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>修改 src/App.tsx,引入 antd 的按钮组件。</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="8">
<pre class="cke_widget_element" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;javascript&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;import React, { FC } from 'react';\nimport { Button } from 'antd';\nimport './App.css';\n\nconst App: FC = () =&amp;gt; (\n&amp;lt;div className=\&amp;quot;App\&amp;quot;&amp;gt;\n    &amp;lt;Button type=\&amp;quot;primary\&amp;quot;&amp;gt;Button&amp;lt;/Button&amp;gt;\n&amp;lt;/div&amp;gt;\n);\n\nexport default App;&amp;quot;,&amp;quot;classes&amp;quot;:[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-javascript hljs"><span class="hljs-keyword">import React, { FC } <span class="hljs-keyword">from <span class="hljs-string">'react';
<span class="hljs-keyword">import { Button } <span class="hljs-keyword">from <span class="hljs-string">'antd';
<span class="hljs-keyword">import <span class="hljs-string">'./App.css';

<span class="hljs-keyword">const App: FC = <span class="hljs-function"><span class="hljs-params">() =&gt; (
<span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div <span class="hljs-attr">className=<span class="hljs-string">"App"&gt;
    <span class="hljs-tag">&lt;<span class="hljs-name">Button <span class="hljs-attr">type=<span class="hljs-string">"primary"&gt;Button<span class="hljs-tag">&lt;/<span class="hljs-name">Button&gt;
<span class="hljs-tag">&lt;/<span class="hljs-name">div&gt;
);

<span class="hljs-keyword">export <span class="hljs-keyword">default App;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img width="15" height="15" class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>修改 src/App.css,在文件顶部引入 antd 的样式。</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="7">
<pre class="cke_widget_element" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;javascript&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;@import '~antd/dist/antd.css';&amp;quot;,&amp;quot;classes&amp;quot;:[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-javascript hljs">@<span class="hljs-keyword">import <span class="hljs-string">'~antd/dist/antd.css';</span></span></code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img width="15" height="15" class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>重新启动 yarn start,现在你应该能看到页面上已经有了 antd 的蓝色按钮组件,接下来就可以继续选用其他组件开发应用了。其他开发流程你可以参考 create-react-app 的官方文档。</p>
<p>antd 使用 TypeScript 书写并提供了完整的定义,你可以享受组件属性输入建议和定义检查的功能。</p>
<p>注意不要安装 @types/antd。</p>
<p><strong>高级配置</strong></p>
<p>这个例子在实际开发中还有一些优化的空间,比如无法进行主题配置。</p>
<p>此时我们需要对 create-react-app 的默认配置进行自定义,这里我们使用 craco (一个对 create-react-app 进行自定义配置的社区解决方案)。</p>
<p>现在我们安装 craco 并修改 package.json 里的 scripts 属性。</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="6">
<pre class="cke_widget_element" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;javascript&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;$ yarn add @craco/craco&amp;quot;,&amp;quot;classes&amp;quot;:[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-javascript hljs">$ yarn add @craco/craco</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img width="15" height="15" class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="5">
<pre class="cke_widget_element" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;javascript&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;/* package.json */\n\&amp;quot;scripts\&amp;quot;: {\n-   \&amp;quot;start\&amp;quot;: \&amp;quot;react-scripts start\&amp;quot;,\n-   \&amp;quot;build\&amp;quot;: \&amp;quot;react-scripts build\&amp;quot;,\n-   \&amp;quot;test\&amp;quot;: \&amp;quot;react-scripts test\&amp;quot;,\n+   \&amp;quot;start\&amp;quot;: \&amp;quot;craco start\&amp;quot;,\n+   \&amp;quot;build\&amp;quot;: \&amp;quot;craco build\&amp;quot;,\n+   \&amp;quot;test\&amp;quot;: \&amp;quot;craco test\&amp;quot;,\n}&amp;quot;,&amp;quot;classes&amp;quot;:[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-javascript hljs"><span class="hljs-comment">/* package.json */
<span class="hljs-string">"scripts": {
-   <span class="hljs-string">"start": <span class="hljs-string">"react-scripts start",
-   <span class="hljs-string">"build": <span class="hljs-string">"react-scripts build",
-   <span class="hljs-string">"test": <span class="hljs-string">"react-scripts test",
+   <span class="hljs-string">"start": <span class="hljs-string">"craco start",
+   <span class="hljs-string">"build": <span class="hljs-string">"craco build",
+   <span class="hljs-string">"test": <span class="hljs-string">"craco test",
}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img width="15" height="15" class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>然后在项目根目录创建一个 craco.config.js 用于修改默认配置。</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="4">
<pre class="cke_widget_element" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;javascript&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;/* craco.config.js */\nmodule.exports = {\n// ...\n};&amp;quot;,&amp;quot;classes&amp;quot;:[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-javascript hljs"><span class="hljs-comment">/* craco.config.js */
<span class="hljs-built_in">module.exports = {
<span class="hljs-comment">// ...
};</span></span></span></code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img width="15" height="15" class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p><strong>自定义主题</strong></p>
<p>按照 配置主题 的要求,自定义主题需要用到类似 less-loader 提供的 less 变量覆盖功能。我们可以引入 craco-less 来帮助加载 less 样式和修改变量。</p>
<p>首先把 src/App.css 文件修改为 src/App.less,然后修改样式引用为 less 文件。</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="3">
<pre class="cke_widget_element" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;javascript&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;/* src/App.ts */\n- import './App.css';\n+ import './App.less';&amp;quot;,&amp;quot;classes&amp;quot;:[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-javascript hljs"><span class="hljs-comment">/* src/App.ts */
- <span class="hljs-keyword">import <span class="hljs-string">'./App.css';
+ <span class="hljs-keyword">import <span class="hljs-string">'./App.less';</span></span></span></span></span></code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img width="15" height="15" class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="2">
<pre class="cke_widget_element" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;javascript&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;/* src/App.less */\n- @import '~antd/dist/antd.css';\n+ @import '~antd/dist/antd.less';&amp;quot;,&amp;quot;classes&amp;quot;:[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-javascript hljs"><span class="hljs-comment">/* src/App.less */
- @<span class="hljs-keyword">import <span class="hljs-string">'~antd/dist/antd.css';
+ @<span class="hljs-keyword">import <span class="hljs-string">'~antd/dist/antd.less';</span></span></span></span></span></code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img width="15" height="15" class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>然后安装 craco-less 并修改 craco.config.js 文件如下。</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="1">
<pre class="cke_widget_element" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;javascript&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;$ yarn add craco-less&amp;quot;,&amp;quot;classes&amp;quot;:[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-javascript hljs">$ yarn add craco-less</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img width="15" height="15" class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="0">
<pre class="cke_widget_element" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;javascript&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;const CracoLessPlugin = require('craco-less');\n\nmodule.exports = {\nplugins: [\n    {\n      plugin: CracoLessPlugin,\n      options: {\n      lessLoaderOptions: {\n          lessOptions: {\n            modifyVars: { '@primary-color': '#1DA57A' },\n            javascriptEnabled: true,\n          },\n      },\n      },\n    },\n],\n};&amp;quot;,&amp;quot;classes&amp;quot;:[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-javascript hljs"><span class="hljs-keyword">const CracoLessPlugin = <span class="hljs-built_in">require(<span class="hljs-string">'craco-less');

<span class="hljs-built_in">module.exports = {
<span class="hljs-attr">plugins: [
    {
      <span class="hljs-attr">plugin: CracoLessPlugin,
      <span class="hljs-attr">options: {
      <span class="hljs-attr">lessLoaderOptions: {
          <span class="hljs-attr">lessOptions: {
            <span class="hljs-attr">modifyVars: { <span class="hljs-string">'@primary-color': <span class="hljs-string">'#1DA57A' },
            <span class="hljs-attr">javascriptEnabled: <span class="hljs-literal">true,
          },
      },
      },
    },
],
};</span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img width="15" height="15" class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>这里利用了 less-loader 的 modifyVars 来进行主题配置,变量和其他配置方式可以参考 配置主题 文档。修改后重启 yarn start,如果看到一个绿色的按钮就说明配置成功了。</p>
<p>antd 内建了深色主题和紧凑主题,你可以参照 使用暗色主题和紧凑主题 进行接入。</p>
<p>同样,你可以使用 react-app-rewired 和 customize-cra 来自定义 create-react-app 的 webpack 配置。</p>
<h3>三、项目地址:</h3>
<p>https://github.com/samveduan/typescript-react-app</p>
<h3>四、参考资料:</h3>
<p>https://create-react-app.dev/docs/getting-started/</p>
<p>https://ant.design/docs/react/use-in-typescript-cn</p><br><br>
来源:https://www.cnblogs.com/samve/p/14106158.html
頁: [1]
查看完整版本: 使用create-react-app搭建TypeScript+React+Ant Design开发环境