antd+react 프로젝트 이전vite의 해결 방안을 상세히 설명합니다.

antd+react+webpack은 흔히react기술 창고를 위주로 하는 전단 프로젝트의 표준 조합이다. 이 세 가지는 모두 성숙한 생태와 안정적인 표현을 가지고 있지만 전단권의 기술이 끊임없이 혁신되면서 차세대 구축 플랫폼인vite2가 발표되면서 웹팩은 그다지 향기롭지 않은 것 같다. 왜 이렇게 말하는가.vite가 너무 빠르기 때문이다.한동안의 시도를 거쳐 프로젝트에서 웹팩을vite로 바꾸어 보기로 결정하여 본문으로 작성하여 여러분에게 공유합니다.

Vite가 뭐예요?


본고의 주인공으로서 먼저vite라는 구축 도구를 간단하게 소개한다. 이 도구는 유우계가 내놓은 [차세대 전단 개발과 구축 도구]이다.vite는 사실 새로운 도구가 아니다. 일찍이 1년여 전에 이미 많은 버전을 내놓았다. 2.x버전의 출시는 앞부분에 충분한 진동을 일으키고 vite의 성숙함과 강함을 상징한다. 여기에서vite를 상세하게 소개할 생각은 없다. 홈페이지https://cn.vitejs.dev/를 참고하여 알 수 있다.

마이그레이션 프로세스


vite라는 도구를 알게 되면 우리는 이전 작업에 착수할 수 있다.

1.vite 의존 설치


npm i vite antd-vite-import-plugin @vitejs/plugin-react-refresh vite-plugin-html -D

2. 프로젝트 기존 의존 항목 업데이트


여기 저희 프로젝트는 dva+antd3를 사용합니다.x를 기초로 하는 개발 프레임워크입니다. 여기서 저는 시스템의 주요 의존항을 최신 버전으로 업그레이드했습니다. 예를 들어 dva에서 제가 사용하는 2.6.0-beta입니다.22버전, 기타 첨부된react,react-dom,react-router-dom 및 @babel/plugin-transform-runtime 등 관련 의존항이 모두 업데이트되었습니다(antd 또는 3.x 버전, 4.x의 큰 버전으로 업데이트되지 않음). 이 부분은 자신의 실제 수요에 달려 있습니다.

3. 프로젝트 루트에vite를 추가합니다.config.js 프로필


웹 팩의 프로필에 비해vite는 매우 간단하고 많은 기능이 내장되어 있다. 예를 들어 정적 자원에 대한 처리, 기능 오픈도 비교적 간단하다. 구체적으로 다음과 같다.

import { defineConfig } from 'vite';
import vitePluginHtml from 'vite-plugin-html';
import reactRefresh from '@vitejs/plugin-react-refresh';

export default defineConfig({
    css: {
        preprocessorOptions: {
            less: {
                javascriptEnabled: true,
            },
        }
    },
    publicDir: './src/configs',
    plugins: [
        reactRefresh(),
        antdViteImportPlugin(),
        vitePluginHtml({
            minify: true,
            inject: {
                injectData: {
                    title: 'vite-react-example',
                    injectScript: '<script src="/configs.js"></script>', // publicDir 
                },
                injectOptions: {
                    filename: './index.html', //  
                }
            },
        }),
    ],
    server: {
        open: true,
        port: 10010,
    }
});

여기에서vite-plugin-html 플러그인을 html-webpack-plugin의 대체 방안으로 사용했습니다. 그 중에서 injectData와 injectOptions 옵션을 주의해야 합니다. injectData는 우리의 템플릿 페이지에 사용자 정의 데이터를 쉽게 삽입할 수 있습니다. injectOptions는 템플릿 페이지를 지정할 수 있고 다른 설정 항목도 참고할 수 있습니다https://www.npmjs.com/package/vite-plugin-html.상응하는 수요 개조 index.html 페이지:

<!DOCTYPE html>
<head>
    <meta charset="utf-8">
    <title><%- title %></title>
    ......
</head>
<body>
    <div id="app"></div>
    <script>
        var global = globalThis || window; //  
    </script>
    <%- injectScript %>
    <script type="module" src="/src/index.jsx"></script>
</body>
</html>
웹 팩과 차이가 있는 것은 입구 파일을 수동으로 지정해야 한다는 것입니다. 스크립트의 탭 type은module입니다.

4. 파일 접미사 수정


이 파일은 js를 접두사로 하는react 구성 요소입니다. 웹 페이지 구축 플랫폼에서 js(x),ts(x)는 문제없습니다. 하지만vite를 사용한다면 ts,jsx,tsx의 접두사 파일이 가장 좋습니다. 이 문제에 관해서는 이 issue를 보실 수 있습니다.https://github.com/vitejs/vite/issues/1552마지막으로 작가가 대량으로 접두사를 고치는 것이 이렇게 어렵다는 구조를 냈으니 됐어. 그냥 고쳐. 수동으로 고치는 것이 귀찮으면 스크립트를 쓰는 것도 어렵지 않아.

5. 시작 스크립트 추가


"scripts": {
 "dev": "vite",
 "build": "vite build",
 ......
}
여기까지는 얼마 안 남았을 거예요. 그런데 상황이 그렇게 순조롭지 않아요. 프로젝트가 잘 안 돼요. 그래요. 그렇게 순조로운 일은 없어요. 다음은 우리가 직면한 문제를 봅시다.

당면한 문제


1.decorators not support


비즈니스 코드에서, 우리는 dva가 제공하는connect를 사용하여 귀속 상태를 사용합니다. 예를 들어 다음과 같습니다.

@connect(state =&gt; state.foo)
class Foo extends React.PureComponent {
 ....
}
그러나 decorators 문법은vite에 지원되지 않는다. 이 문제에 관해서도 issus가 하나 있다.https://github.com/vitejs/vite/issues/2349현재 좋은 해결 방법이 없어서 decorators를 제거하고 일반적인 함수로 귀속할 수밖에 없습니다.

2.antd Unknown theme type: undefined, name: undefined


우리 프로젝트는 아직도antd를 사용하고 있습니다.x 버전, 시작할 때 이 오류가 발생했습니다. 사실은antd 구성 요소를 초기화할 때antd/es/icon/index를 불러왔습니다.js 파일:

import * as allIcons from '@ant-design/icons/lib/dist';
......
ReactIcon.add.apply(ReactIcon, _toConsumableArray(Object.keys(allIcons).map(function (key) {
  return allIcons[key];
})));
......
'@ant-design/icons/lib/dist' 내보낸 객체는 {default: {...},올바르게 접근할 형식은 all Icons입니다.default, allicons가 아니라 아이콘의 정확한 내보내기 대상을 얻을 수 없습니다. 이 문제에 관해서는 이 issue를 보실 수 있습니다.https://github.com/ant-design/ant-design/issues/19002여기서 설명할 점은antd4입니다.x버전은 나타나지 않지만 저희 프로젝트에 있어서는 아직 4버전으로 업그레이드되지 않습니다. 그러면 어떻게 해결합니까? 사실antd/lib의 구성 요소를 인용하기만 하면 이 문제가 없습니다. 우리는 antd/lib/icon/index를 볼 수 있습니다.js:

......
var allIcons = _interopRequireWildcard(require("@ant-design/icons/lib/dist"));

function _interopRequireWildcard(obj) { if (obj &amp;&amp; obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" &amp;&amp; typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache &amp;&amp; cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty &amp;&amp; Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc &amp;&amp; (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
......

여기_interop Require Wildcard 방법은 우리가 도출한 문제를 처리하는 데 도움을 주었다. 그러면 babel-plugin-import의 설정을 수정하면 되지 않겠는가. 그래, 쉽지 않다. vite는 babel-plugin-import에 대한 지원이 좋지 않다. 우선vite의 issues에 가서 찾아보자. 비슷한 질문이 하나 있다. https://github.com/vitejs/vite/issues/1389, 내 문제를 해결하지 못했다. 안에 언급된 몇 개의 플러그인은 오히려 나에게 아이디어를 주었다.그럼 우리의요구를 실현하기 위해vite플러그인을 직접 쓰세요.플러그인의 사고방식은 간단하다. 즉, antd 구성 요소의 도입 방식을 통일적으로 수정하는 것이다.

--- ---
import { Button } from 'antd';

--- ---
import Button from 'antd/lib/button';
import 'antd/lib/button/style/index.css';
여기서 설명해야 할 것은 css 스타일의 도입입니다. 만약에 스타일/index나 스타일/css를 도입하면 Require is not defined의 문제가 발생할 수 있습니다. 이 두 js 파일에서 Require를 사용했기 때문에vite는 미리 컴파일할 때 node 환경이 아니므로 당연히 잘못 보고합니다.
이 플러그인의 사용에 관해서는 https://www.npmjs.com/package/antd-vite-import-plugin 참고할 수 있습니다.

3.'default' is not exported


때때로 삼자 의존항을 불러오는 데 오류가 발생할 수 있습니다. 예를 들어'default'is not exported 등입니다. 참고할 수 있습니다https://github.com/vitejs/vite/issues/2679
실제 개발 과정에서 이상한 문제에 부딪히는 것은 모두 맛보는 대가이다.
속도 싸움
vite의 장점 중 하나는 빠르다는 것이다. 그러면 웹팩과 비교하면 도대체 얼마나 큰 차이가 있는가. 여기서 우리는 웹팩과vite로 각각 같은 로컬 프로젝트를 시작한다.
구축 도구
시작 시간 (ms)
vite
702ms
webpack
7093ms
이것은 대략적인 대비일 뿐이다. 데이터적으로 보면 10배의 차이가 있다. 속도로만 말하자면vite는 매우 빠르다. 홈페이지의 해석에 따르면vite는esbuild를 사용하여 미리 구축하는 의존을 사용할 것이다.Esbuild는 Go를 사용하여 작성되며 JavaScript로 작성된 패키지 사전 구축 의존도보다 10-100배 빠릅니다.

마지막


한바탕 고생을 한 후에vite2의 성숙도가 부족하다고 생각해서 작은 프로젝트에서 시도해 볼 수 있다.나로서는 우선 웹 팩을 사용하기로 결정합시다. 웹 팩은 이렇게 많은 발전을 거쳤기 때문에 구덩이가 매우 적지만 현재vite는react에 있어서 그렇게 완벽하지 않습니다.
이것은antd+react 프로젝트 이전vite의 해결 방안에 대한 상세한 설명입니다. 더 많은 관련antdreact 이전vite 내용은 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기