淼宇心柔 發表於 2022-9-15 09:09:00

Vite+React搭建开发构建环境实践

<h2 id="前言">前言</h2>
<p>使用 Vite 已经有两年了,期间使用它开发过单页面应用,也开发过浏览器扩展插件,对比日常工作中用到的 webpack 构建速度大幅提升,开发体验也好很多。<br>
虽然相比于 webpack 来说简单了很多,但是仍然有一些配置需要记录一下,以便之后可以快速搭建一个本地开发构建的环境。</p>
<h2 id="使用-create-vite-脚手架生成基础模板">使用 create-vite 脚手架生成基础模板</h2>
<p>运行命令安装脚手架</p>
<pre><code>yarn create vite
</code></pre>
<p>我在安装时提供的命令行选项那里,选择了 React + TypeScript。</p>
<p>使用下面的命令启动项目</p>
<pre><code>yarn dev
</code></pre>
<p>此时的项目已经默认集成了 @vitejs/plugin-react 这个插件。</p>
<p>到这一步其实就已经基本结束了,自动集成 HMR,jsx,ts,css module,资源打包等一系列功能。</p>
<p>相比于 webpack,简直不要太友好。</p>
<h2 id="eslint">eslint</h2>
<p>先安装 <strong>eslint</strong>:</p>
<pre><code>yarn add eslint -D
</code></pre>
<p>然后初始化<strong>eslint</strong>配置:</p>
<pre><code>yarn eslint --init
</code></pre>
<p>选择选项后,我自己安装的库大致是:</p>
<pre><code>eslint-plugin-react@latest
eslint-config-standard-with-typescript@latest
@typescript-eslint/eslint-plugin@^5.0.0
eslint@^8.0.1
eslint-plugin-import@^2.25.2
eslint-plugin-n@^15.0.0
eslint-plugin-promise@^6.0.0
typescript@* // 这个可以移除
</code></pre>
<p>之后有两个方案:</p>
<ul>
<li>方案一,使用<strong>vite-plugin-eslint</strong>,这个会在报错时在页面上显示报错信息。</li>
<li>方案二,使用 VSCode 的 ESlint 插件去使用 ESLint,这个是在代码上出现红线报错。(个人更喜欢这种)</li>
</ul>
<p>方案二直接用插件即可,方案一需要安装一下库:</p>
<pre><code>yarn add vite-plugin-eslint -D
</code></pre>
<p>安装完毕后,在<strong>vite.config.ts</strong>中配置:</p>
<pre><code>//...
import eslint from "vite-plugin-eslint";

export default defineConfig({
    plugins: ,
    //...
});
</code></pre>
<p>无论方案一还是方案二,此时仍会报错,因为 ESLint 无法解析 ts 代码,所以还需要安装 @typescript-eslint/parser</p>
<pre><code>yarn add @typescript-eslint/parser -D
</code></pre>
<p>最后你还需要在.eslintrc.json 加上这行配置:</p>
<pre><code>"parserOptions": {
    //...
    "project": "tsconfig.json"
},
</code></pre>
<p>基本完毕。</p>
<p>为什么说是基本?因为 eslint 配置还是更多跟代码习惯有关,比如单双引号的使用之类的,所以刚配置完一般都一堆报错,还需要自己去慢慢调整。</p>
<p>而且还涉及到与 prettier 的配置相冲突的问题,eslint 和 prettier 的配置分别是代码校验和代码格式化时的规则,所以也是要保证规则一致的。</p>
<p>手动调整规则太繁琐了,一般使用<strong>eslint-config-prettier</strong>禁用掉 ESLint 中和 Prettier 配置有冲突的规则,然后用<strong>eslint-plugin-prettier</strong>保证 eslint 用 prettier 的风格校验。</p>
<pre><code>yarn add eslint-config-prettier eslint-plugin-prettier -D
</code></pre>
<p>然后在.eslintrc.json 中加上配置:</p>
<pre><code>{
    "extends": [
      //...
      "plugin:prettier/recommended"
    ],
}
</code></pre>
<p>另外根据需要一般常用的配置列一下:</p>
<pre><code>{
    "rules": {
      "react/react-in-jsx-scope":"off", // 使用 jsx 时不需要引用 React
      "@typescript-eslint/strict-boolean-expressions":"off" // 表达式中的布尔值必须严格是布尔类型
    }
}
</code></pre>
<p>这里也可能涉及到对<strong>tsconfig.json</strong>的修改:</p>
<pre><code>{
"compilerOptions": {
    "noImplicitAny":false, // 未声明类型的变量自动默认为any类型
}
}
</code></pre>
<p>这里的配置较多,并且也因人而异,就不一一赘述了。</p>
<p>只要保持团队内部代码风格统一,就算是不符合标准规范的代码,其实也是好代码。</p>
<h2 id="prettier">prettier</h2>
<p>安装</p>
<pre><code>yarn add prettier -D
</code></pre>
<p>根目录下新建.prettierrc 配置文件,然后给个我自己用的配置方案:</p>
<pre><code>{
    printWidth: 100,
    tabWidth: 4,
    useTabs: false,
    singleQuote: true,
    jsxSingleQuote: false,
    endOfLine: 'lf'
}
</code></pre>
<p>一般这个配合 VSCode 的 Prettier 插件和保存时格式化即可。</p>
<p>另外,对于 lf 和 crlf 的处理,保存时没法切换,需要在 VSCode 中设置。</p>
<h2 id="react-router">react-router</h2>
<p>安装:</p>
<pre><code>yarn add react-router-dom
</code></pre>
<p>然后修改 main.tsx 中的代码吧:</p>
<pre><code>//...
import {RouterProvider} from "react-router-dom";
import router from './router';

//...
ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
    &lt;React.StrictMode&gt;
      &lt;RouterProvider router={router} /&gt;
    &lt;/React.StrictMode&gt;
);
</code></pre>
<p>这里我将路由相关代码放在了单独的路由文件 router.tsx 中:</p>
<pre><code>import { createBrowserRouter } from 'react-router-dom';
import Framework from './Framework';
import Error from './Error';
import Home from '@/pages/home';
import About from '@/pages/about';

const router = createBrowserRouter([
    {
      path: '/',
      element: &lt;Framework /&gt;,
      errorElement: &lt;Error /&gt;,
      children: [
            {
                path: 'home',
                element: &lt;Home /&gt;,
            },
            {
                path: 'about',
                element: &lt;About /&gt;,
            },
      ],
    },
]);

export default router;
</code></pre>
<h2 id="antd">antd</h2>
<p>安装命令:</p>
<pre><code>yarn add antd
</code></pre>
<p>然后在主 less 文件中加上代码:</p>
<pre><code>@import 'antd/es/style/themes/default.less';
@import 'antd/dist/antd.less';

@primary-color: #4294ff; // 更换全局主色
</code></pre>
<p>然后还需要更改 <strong>vite.config.ts</strong>:</p>
<pre><code>//...
export default defineConfig({
   //...
    css: {
      preprocessorOptions: {
            less: {
                javascriptEnabled: true,
            },
      },
    },
});
</code></pre>
<h2 id="别名">别名</h2>
<p>通常我们会使用下面的方式来使用别名:</p>
<pre><code>import reactLogo from "@/assets/react.svg";
</code></pre>
<p>默认情况下,会直接报错,所以我们需要在<strong>vite.config.ts</strong>进行如下配置:</p>
<pre><code>//...
import path from "path";

export default defineConfig({
    //...
    resolve: {
      alias: {
            "@": path.resolve(__dirname, "src"),
      },
    },
});
</code></pre>
<p>这里因为没有 path 这个依赖库,所以还要运行命令安装:</p>
<pre><code>yarn add path -D
</code></pre>
<p>此时别名功能已经可以正常使用,但是<strong>__dirname</strong>会报红,需要安装@types/node</p>
<pre><code>yarn add @types/node -D
</code></pre>
<p>这时别名时没有智能提示的,所以还需要在<strong>tsconfig.json</strong>中,配置:</p>
<pre><code>{
    "compilerOptions": {
      //...
      "baseUrl": "./",
      "paths": {
            "@/*": ["src/*"]
      }
    },
}
</code></pre>
<p>完毕。</p>
<h2 id="less-与-css-module">Less 与 CSS Module</h2>
<p>Vite 已集成了 CSS Module 功能,但是想要使用 Less 还需要安装 less 这个库。</p>
<pre><code>yarn add less
</code></pre>
<p>最后使用的方式如下:</p>
<pre><code>import styles from "./App.module.less";
</code></pre>
<p>我们可能会用到一些<strong>Less全局变量</strong>来作为主题之类的,它可能是这样的<strong>theme.less</strong>:</p>
<pre><code>@primaryColor: #4294ff; // 全局主色
</code></pre>
<p>然后修改<strong>vite.config.ts</strong>为:</p>
<pre><code>export default defineConfig({
// ...
css: {
    preprocessorOptions: {
      less: {
      javascriptEnabled: true,
      additionalData: `@import "${path.resolve(__dirname, 'src/theme.less')}";`,
      },
    },
},
});
</code></pre>
<p>这个可以默认给每个less文件都引入这个theme.less。</p>
<h2 id="转换svg">转换svg</h2>
<p>将引入的svg文件转为react组件。</p>
<p>安装库:</p>
<pre><code>yarn add vite-plugin-svgr -D
</code></pre>
<p>然后再vite.config.js中配置一下:</p>
<pre><code>import svgr from 'vite-plugin-svgr'

export default {
// ...
plugins: ,
}
</code></pre>
<p>因为使用了typescript,还需要在vite-env.d.ts中配置一下:</p>
<pre><code class="language-ts">/// &lt;reference types="vite-plugin-svgr/client" /&gt;
</code></pre>
<p>最后的使用方法:</p>
<pre><code>import { ReactComponent as Logo } from './logo.svg'
</code></pre>
<h2 id="总结">总结</h2>
<p>暂时就记录这么多吧,后续如果有一些别的功能配置,也会统一记录在这篇博客。</p>
<p>示例代码仓库:vite-react-practice。</p>


</div>
<div id="MySignature" role="contentinfo">
    作者:韩子卢
<br/>
出处:https://www.cnblogs.com/vvjiang/
<br/>
本博客文章均为作者原创,转载请注明作者和原文链接。<br><br>
来源:https://www.cnblogs.com/vvjiang/p/16693767.html
頁: [1]
查看完整版本: Vite+React搭建开发构建环境实践