ارتقا به React 19 با استفاده از react-codemod

در این مقاله قصد داریم تا بررسی کنیم که چگونه می‌توانیم بدون بازنویسی هیچ کدی و با استفاده از کتابخانه

react-codemod
react-codemod، برنامه React خود را به آخرین نسخه موجود، یعنی نسخه ۱۹ React ارتقا دهیم.

بررسی react-codemod

react-codemod
react-codemod کتابخانه‌ای است که برای خودکارسازی فرآیند ارتقا یک برنامه React به آخرین نسخه، و بازسازی پایگاه کد برای پشتیبانی از design patternهای جدید طراحی شده است.

react-codemod
react-codemod مجموعه‌ای از اسکریپت‌ها است که الگوهای خاصی را در یک پایگاه کد شناسایی کرده و با کدهای به‌روز شده جایگزین می‌کند. این کتابخانه یک ابزار ضروری برای بازسازی و ارتقا در مقیاس بزرگ بدون نیاز به ویرایش دستی هر فایلی می‌باشد.

آماده‌سازی برنامه React برای ارتقا به نسخه ۱۹  React

قبل از اینکه پایگاه کد React موجود خود را به جدیدترین APIها و design patternها به‌روزرسانی کنیم، ابتدا باید نسخه React پروژه خود را ارتقا دهیم. با اجرای دستور زیر می‌توانیم این کار را انجام دهیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm install --save react@latest
npm install --save react@latest
npm install --save react@latest

در مرحله بعد، باید دایرکتوری پروژه را به عنوان یک Git repository مقداردهی اولیه کنیم، زیرا

react-codemod
react-codemod برای این که به درستی کار کند به یک commit Git نیاز دارد. برای انجام این کار، دستور زیر را اجرا می‌کنیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
git init
git init
git init

نصب react-codemod

کتابخانه

react-codemod را نصب می‌کنیم، که ما را قادر می‌سازد تا مجموعه‌ای از دستورات را اجرا نماییم که به‌طور خودکار پایگاه کد ما را به آخرین APIها و design patternهای React به‌روزرسانی کند. برای نصب کتابخانه
react-codemod
react-codemod دستور زیر را اجرا می‌کنیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm i react-codemod
npm i react-codemod
npm i react-codemod

انتقال پایگاه کد به نسخه React 19

اکنون، می‌توانیم به‌روزرسانی پایگاه کد خود را شروع کنیم تا با جدیدترین APIها و design patternهای React هماهنگ شود، بدون اینکه نیاز باشد آن‌ها را به صورت دستی تغییر دهیم. مراحل زیر نشان می‌دهند که چگونه باید پایگاه کد React موجود خود را با استفاده از دستورات

react-codemod
react-codemod به APIها و design patternهای React 19 ارتقا دهیم.

تبدیل createElement به کد JSX

تبدیل کد

createElement
createElement به JSX یک گام مهم در مدرن‌سازی پایگاه کد React به حساب می‌آید. JSX روشی بصری، خوانا و قابل نگه‌داری برای نوشتن کامپوننت‌های React در مقایسه با
createElement
createElement ارائه می‌دهد.

کد زیر را به عنوان مثالی در نظر می‌گیریم. این کد از

createElement
createElement برای ایجاد المنت‌های React استفاده می‌کند:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
const element = React.createElement(
'div',
{ className: 'container' },
React.createElement('h1', null, 'Hello, world!'),
React.createElement('p', null, 'This is a React application.')
);
const element = React.createElement( 'div', { className: 'container' }, React.createElement('h1', null, 'Hello, world!'), React.createElement('p', null, 'This is a React application.') );
const element = React.createElement(
  'div',
  { className: 'container' },
  React.createElement('h1', null, 'Hello, world!'),
  React.createElement('p', null, 'This is a React application.')
);

برای تبدیل کد

createElement
createElement بالا به کد JSX معادل آن، ابتدا باید یک Git commit را اجرا کنیم و سپس دستور
react-codemod
react-codemod را برای
create-element-to-jsx
create-element-to-jsx با استفاده از دستورات زیر اجرا نماییم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
git add .
git commit -m "Commit message"
npx react-codemod create-element-to-jsx src/
git add . git commit -m "Commit message" npx react-codemod create-element-to-jsx src/
git add .
git commit -m "Commit message"
npx react-codemod create-element-to-jsx src/

پس از اجرای دستور بالا، با این سوال

Which dialect of JavaScript do you use?
Which dialect of JavaScript do you use? مواجه می‌شویم که باید گزینه مورد نظر خود را انتخاب کنیم.

پس از آن، با بررسی پایگاه کد خود متوجه می‌شویم که تمام نمونه‌های

createElement
createElement به نسخه‌های JSX مربوطه به‌روزرسانی شده‌اند. به عنوان مثال، کد
createElement
createElement بالا به کد JSX زیر تبدیل می‌شود:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
const element = (
<div className="container">
<h1>Hello, world!</h1>
<p>This is a React application.</p>
</div>
);
const element = ( <div className="container"> <h1>Hello, world!</h1> <p>This is a React application.</p> </div> );
const element = (  
<div className="container">
    <h1>Hello, world!</h1>
    <p>This is a React application.</p>
  </div>
);

تبدیل function bindingها به arrow functionها

در کلاس کامپوننت‌ها، استفاده از arrow functionها یک رویکرد مختصر و مدرن ارائه می‌کند که نیاز به اتصالات صریح را از بین می‌برد. با استفاده از

react-codemod
react-codemod می‌توانیم به راحتی همه توابع binding در پایگاه کد خود را بدون نیاز به بازنویسی کل کامپوننت به arrow functionها تبدیل کنیم.

در ادامه کامپوننت زیر را بررسی می‌کنیم که چگونه می‌توانیم آن را به arrow functionها تبدیل نماییم.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
console.log('Button clicked!');
}
render() {
return <button onClick={this.handleClick}>Click me</button>;
}
}
class MyComponent extends React.Component { constructor(props) { super(props); this.handleClick = this.handleClick.bind(this); } handleClick() { console.log('Button clicked!'); } render() { return <button onClick={this.handleClick}>Click me</button>; } }
class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.handleClick = this.handleClick.bind(this);
  }
  handleClick() {
    console.log('Button clicked!');
  }
  render() {
    return <button onClick={this.handleClick}>Click me</button>;
  }
}

برای تبدیل توابع binding در کامپوننت بالا به arrow functionها، دستورات زیر را در ترمینال اجرا می‌کنیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
git add .
git commit -m "Commit message"
npx react-codemod manual-bind-to-arrow src/
git add . git commit -m "Commit message" npx react-codemod manual-bind-to-arrow src/
git add .
git commit -m "Commit message"
npx react-codemod manual-bind-to-arrow src/

در این مرحله نیز با این سوال

Which dialect of JavaScript do you use?
Which dialect of JavaScript do you use? مواجه می‌شویم که باید گزینه مورد نظر خود را انتخاب کنیم.

پس از موفقیت آمیز بودن دستور بالا، همانطور که در کد زیر مشاهده می‌کنیم توابع binding به arrow functionها تبدیل می‌شوند:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
class MyComponent extends React.Component {
handleClick = () => {
console.log('Button clicked!');
};
render() {
return <button onClick={this.handleClick}>Click me</button>;
}
}
class MyComponent extends React.Component { handleClick = () => { console.log('Button clicked!'); }; render() { return <button onClick={this.handleClick}>Click me</button>; } }
class MyComponent extends React.Component {
  handleClick = () => {
    console.log('Button clicked!');
  };
  render() {
    return <button onClick={this.handleClick}>Click me</button>;
  }
}

تبدیل PropTypes به prop-types

با شروع نسخه React 19،

PropTypes
PropTypes از پکیج React حذف شده و با
prop-types
prop-types جایگزین می‌شود. این بدان معنی است که اگر از
PropTypes
PropTypes در پایگاه کد خود استفاده می‌کنیم، باید آن را به‌روزرسانی نماییم و به جای آن از
prop-types
prop-types استفاده کنیم.

در ادامه کد زیر را از

PropTypes
PropTypes به
prop-types
prop-types تبدیل کرده و دستور import مناسب را اضافه کنیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
import React from 'react';
class MyComponent extends React.Component {
render() {
return <div>{this.props.name}</div>;
}
}
MyComponent.propTypes = {
name: React.PropTypes.string.isRequired,
};
import React from 'react'; class MyComponent extends React.Component { render() { return <div>{this.props.name}</div>; } } MyComponent.propTypes = { name: React.PropTypes.string.isRequired, };
import React from 'react';
class MyComponent extends React.Component {
  render() {
    return <div>{this.props.name}</div>;
  }
}
MyComponent.propTypes = {
  name: React.PropTypes.string.isRequired,
};

می‌توانیم کد

PropTypes
PropTypes را با اجرای دستور
react-codemod
react-codemod زیر به
prop-types
prop-types تبدیل نماییم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
git add .
git commit -m "Commit message"
npx react-codemod manual-bind-to-arrow src/
git add . git commit -m "Commit message" npx react-codemod manual-bind-to-arrow src/
git add .
git commit -m "Commit message"
npx react-codemod manual-bind-to-arrow src/

پس از اجرای دستور بالا، پایگاه کد ما به طور خودکار برای استفاده از

prop-types
prop-types به‌روزرسانی می‌شود:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
import React from 'react';
import PropTypes from 'prop-types';
class MyComponent extends React.Component {
render() {
return <div>{this.props.name}</div>;
}
}
MyComponent.propTypes = {
name: PropTypes.string.isRequired,
};
import React from 'react'; import PropTypes from 'prop-types'; class MyComponent extends React.Component { render() { return <div>{this.props.name}</div>; } } MyComponent.propTypes = { name: PropTypes.string.isRequired, };
import React from 'react';
import PropTypes from 'prop-types';
class MyComponent extends React.Component {
  render() {
    return <div>{this.props.name}</div>;
  }
}
MyComponent.propTypes = {
  name: PropTypes.string.isRequired,
};

تبدیل کلاس کامپوننت به PureComponent

هنگامی که یک کامپوننت parent مجددا رندر می‌شود، React کامپوننت‌های child آن را نیز دوباره رندر می‌کند. استفاده از

PureComponent
PureComponent به جلوگیری از رندر مجدد غیرضروری کلاس کامپوننت‌ها کمک می‌کند، تا زمانی که ویژگی‌ها و state کامپوننت بدون تغییر باقی بماند.

به عنوان مثال، در کد زیر همیشه زمانی که کامپوننت parent مجددا رندر می‌شود، این کامپوننت هم re-render می‌شود که این موضوع می‌تواند عملکرد برنامه را کاهش دهد:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
import React from 'react';
class MyComponent extends React.Component {
render() {
return <div>{this.props.name}</div>;
}
}
import React from 'react'; class MyComponent extends React.Component { render() { return <div>{this.props.name}</div>; } }
import React from 'react';
class MyComponent extends React.Component {
  render() {
    return <div>{this.props.name}</div>;
  }
}

برای جلوگیری از رندر شدن مجدد کامپوننت‌های child زمانی که ویژگی‌ها و state آن‌ها در طول رندر مجدد کامپوننت parent بدون تغییر باقی می‌ماند، باید کلاس کامپوننت‌های برنامه خود را با استفاده از دستور زیر به

PureComponent
PureComponent تبدیل نماییم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
git add .
git commit -m "Commit a message"
npx react-codemod pure-component src/
git add . git commit -m "Commit a message" npx react-codemod pure-component src/
git add .
git commit -m "Commit a message"
npx react-codemod pure-component src/

با اجرای دستور بالا با سوالات زیر مواجه خواهیم شد:

  • Which dialect of JavaScript do you use?
    Which dialect of JavaScript do you use? گزینه مورد نظر خود را انتخاب می‌کنیم
  • Use arrow functions?
    Use arrow functions? برای تبدیل هر کامپوننت تابع به arrow function، به این سوال با
    'y'
    'y' پاسخ می‌دهیم.
  • Destructure props?
    Destructure props? در صورت لزوم، به این سوال با
    'y'
    'y' پاسخ می‌دهیم تا به طور خودکار کامپوننت‌های موجود در لیست آرگومان تابع را destruct کنیم.

هنگامی که دستور کامل شود، کلاس کامپوننت‌های پایگاه کد ما به

PureComponent
PureComponent تبدیل می‌شوند و از رندر مجدد غیرضروری کامپوننت‌های child جلوگیری می‌کنند. همانطور که می‌بینیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
import React, { PureComponent } from 'react';
class MyComponent extends PureComponent {
render() {
return <div>{this.props.name}</div>;
}
}
import React, { PureComponent } from 'react'; class MyComponent extends PureComponent { render() { return <div>{this.props.name}</div>; } }
import React, { PureComponent } from 'react';
class MyComponent extends PureComponent {
  render() {
    return <div>{this.props.name}</div>;
  }
}

جمع‌بندی

در این مقاله بررسی کردیم که چگونه با استفاده از

react-codemod
react-codemod، یک پایگاه کد برنامه React را به آخرین APIهای React یعنی نسخه ۱۹ ارتقا دهیم و design patternها را بدون بازنویسی هیچ کدی به‌روزرسانی نماییم.

به روز نگه داشتن پایگاه کد برنامه با جدیدترین APIها و design patternهای React، عملکرد، امنیت و پایبندی به بهترین شیوه‌ها را تضمین می‌کند.

دیدگاه‌ها:

افزودن دیدگاه جدید