برنامه نویسی

یک افزونه Chrome Generator ایجاد کنید🔥

معرفی

افزونه های مرورگر در زمان های اخیر به طور فزاینده ای محبوب شده اند. آنها دیگر فقط برنامه های کوچک ساده نیستند، بلکه محصولات سودآور و مناسبی هستند که هر روز توسط صدها کاربر استفاده می شود. با افزایش اندازه و پیچیدگی این افزونه‌ها، ساخت آنها با استفاده از کتابخانه‌های مفید جاوا اسکریپت مهم می‌شود. با استفاده از این کتابخانه‌ها، توسعه‌دهندگان می‌توانند افزونه‌های جذاب‌تر و جذاب‌تری ایجاد کنند که تجربه کاربری بهتری را ارائه دهد. با ابزارها و تکنیک های مناسب، افزونه های مرورگر را می توان به ابزارهای قدرتمندی تبدیل کرد که کاربران هر روز به آنها اعتماد می کنند.

در این آموزش قصد دارم به شما یاد بدهم که چگونه می توانید یک افزونه کاربردی کامل و بسیار قدرتمند گوگل کروم ایجاد کنید. به هر حال، برای انجام این کار از CRXJS که یک پلاگین vite و همچنین معروف ترین و پرکاربردترین ReactJs است استفاده می کنیم.

اینم یه نگاه کوتاه 👀

  • صفحه اصلی
  • صفحه نمایش مدال
    @devlopersabbir پسوند screen2

فن آوری

بیایید در مورد فناوری که در این آموزش از آن استفاده می کنیم صحبت کنیم.

سریع

Vite یک ابزار ساخت برای برنامه های کاربردی وب مدرن است. این به گونه ای طراحی شده است که سریع و کارآمد باشد و به توسعه دهندگان اجازه می دهد تا به سرعت نمونه اولیه برنامه های خود را بسازند. Vite از انواع فن آوری های وب مدرن، از جمله ماژول های ES، TypeScript و پیش پردازنده های CSS پشتیبانی می کند. همچنین شامل یک سرور توسعه داخلی با جایگزینی ماژول داغ است که توسعه و آزمایش برنامه ها را در زمان واقعی آسان می کند. Vite یک انتخاب محبوب برای ساخت برنامه‌های Vue.js است، اما می‌توان از آن با چارچوب‌ها و کتابخانه‌های دیگر نیز استفاده کرد. به طور کلی، Vite یک ابزار قدرتمند و انعطاف‌پذیر است که می‌تواند به ساده‌سازی فرآیند توسعه برای برنامه‌های کاربردی وب مدرن کمک کند.

واکنش نشان دهید | پیش بینی کنید

ReactJS یک کتابخانه جاوا اسکریپت برای ساخت رابط کاربری است. از یک DOM مبتنی بر مؤلفه و یک DOM مجازی برای به‌روزرسانی مؤثر رابط کاربری استفاده می‌کند. ReactJS سریع، انعطاف پذیر و به طور گسترده در توسعه وب مدرن استفاده می شود.

یا

در صورت تمایل می توانید از Preact استفاده کنید. PreactJS یک جایگزین سبک وزن برای ReactJS است که برای کارایی و سازگاری بالا طراحی شده است. اغلب در برنامه هایی استفاده می شود که عملکرد آنها بسیار مهم است و ردپای کوچکی دارد.

فکر می کنم باید بدانید CRXJS چیست. بنابراین، این سوال و پاسخ من برای شماست🙂

CRXJS چیست؟

افزونه CRXJS Vite ابزاری است که به شما کمک می‌کند برنامه‌های افزودنی Chrome را با استفاده از فناوری توسعه وب مدرن بسازید.

بسیار خوب اکنون می توانیم برای شروع کدنویسی بپریم 🚀

کد

برای ایجاد پروژه CRXJS ما فقط باید این کد را در ترمینال خود اجرا کنیم. یک چیز خنده دار وجود داشت که @jacksteamdev پیش بینی می کند که برای ایجاد یک پروژه CRXJS فقط 60 ثانیه طول می کشد.

npm init vite@latest
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون تایپ اسکریپت را به عنوان الگو انتخاب کنید و React را برای این پروژه انتخاب کنید.

وقتی init تمام شد، این دستور را اجرا کنید تا افزونه نصب شود.

yarn add @crxjs/vite-plugin@latest -D
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بالاخره ما آماده دیدن خروجی خود هستیم🙂. فقط 1 قدم باقی مانده است

باید پیکربندی Vite را به روز کنیم

برای انجام این کار کافی است به فهرست پروژه خود بروید و پیدا کنید vite.config.ts. این فایل را باز کنید سپس همه چیز را پاک کنید و این کد را همانجا قرار دهید.

import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import { crx } from "@crxjs/vite-plugin";
import manifest from "./manifest.json";

export default defineConfig({
  plugins: [react(), crx({ manifest })],
});
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

حالا اگر اشتباه نکنم شما در خط 4 با پیغام خطا مواجه هستید.😅
با این حال برای رفع این مشکل فقط تماس بگیرید manifest.json از جانب tsconfig.node.json.
باز کن tsconfig.node.json از کارگردان پروژه حالا باید اضافه کنید manifest.json فایل در آرایه شامل. به هر حال در اینجا مثال کد است.

{
  "compilerOptions": {
    "composite": true,
    "skipLibCheck": true,
    "module": "ESNext",
    "moduleResolution": "bundler",
    "allowSyntheticDefaultImports": true
  },
  "include": ["vite.config.ts", "manifest.json"]
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

حالا یک فایل به نام بسازید manifest.json با این دستور

touch manifest.json
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پس از ایجاد manifest.json سپس این کد را در فایل manifest.json جدید خود قرار دهید.

{
  "name": "Keyword Maker",
  "description": "A powerfull keyword maker google chrome extension. Give a paragraph it's make keyword for you.",
  "version": "0.0.1",
  "manifest_version": 3,
  "action": {
    "default_popup": "index.html",
    "default_title": "Keyword Maker",
    "default_icon": {
      "16": "icon.png",
      "24": "icon.png",
      "32": "icon.png"
    }
  },
  "icons": {
    "128": "icon.png",
    "16": "icon.png",
    "256": "icon.png",
    "48": "icon.png"
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

همانطور که می بینید من از نماد استفاده می کنم. اما ما هنوز هیچ نمادی نداریم. با این حال، می توانید یک نماد را از هر جایی دانلود کنید و در خود جایگذاری کنید /public پوشه

امیدوارم اکنون فهرست پروژه شما به شکل زیر باشد:

توضیحات تصویر

سرور توسعه را اجرا کنید

yarn run dev
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خودشه! CRXJS بقیه کارها را انجام خواهد داد.

اکنون آماده افزودن به کروم ما است. برای انجام این کار این مرحله را دنبال کنید. یا اگر می دانید مانیفست را در برنامه افزودنی بارگیری کنید، این کار را ادامه دهید…

افزونه را به کروم اضافه کنید

بیایید آن را امتحان کنیم.

پس از تکمیل ساخت، Chrome یا Edge را باز کنید و به chrome://extensions بروید. حتما سوئیچ حالت توسعه دهنده را روشن کنید.
خود را بکشید dist پوشه را در داشبورد افزونه ها وارد کنید تا آن را نصب کنید. نماد برنامه افزودنی شما در نوار بالا قرار خواهد گرفت. نماد اولین حرف نام برنامه افزودنی خواهد بود.

اکنون فقط برنامه را تغییر دهید width;

/* App.css */
.App {
  text-align: center;
  min-width: 350px;
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

حالا می توانید مانند این خروجی را ببینید. 🚀
توضیحات تصویر

کتابخانه UI و وابستگی های دیگر را اضافه کنید.

برای هدف UI من از Chakra-UI استفاده خواهم کرد که بسیار محبوب است component based UI کتابخانه همچنین از یک نان تست واکنش داغ برای درست کردن یک نان تست عالی استفاده خواهیم کرد.

yarn add @chakra-ui/react @emotion/react @emotion/styled framer-motion react-hot-toast axios && yarn dev
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

تا کنون، ما آماده ایجاد رابط کاربری و عملکرد عالی هستیم.
به هر حال باید تنظیم کنیم ChakraProvider از Chakra-UI همچنین باید Toaster را در قسمت تنظیم کنیم main.tsx فایل. برای انجام این کار کافی است به src -> main.tsx بروید

import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App.tsx";
// import "./index.css";
import { ChakraProvider } from "@chakra-ui/react";
import { Toaster } from "react-hot-toast";

ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
  <React.StrictMode>
    <ChakraProvider> // chakra provider setup
      <Toaster position="bottom-center" reverseOrder={false} /> // toaster provider setup
      <App />
    </ChakraProvider>
  </React.StrictMode>
);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بیایید رابط کاربری صفحه اصلی ایجاد کنیم
این کد است. برای App.tsx

import {
  Button,
  Center,
  Container,
  HStack,
  Heading,
  Image,
  Text,
  Textarea,
  VStack,
} from "@chakra-ui/react";

const App = () => {
  return (
    <Container w="400px" h="auto" mx="auto" p={4}>
      <Center>
        <Image w="16" src="icon.png" alt="logo" />
      </Center>
      <VStack spacing={0} my={2}>
        <Heading as="h1" fontSize="xl" fontWeight="bold">
          Keyword Macker AI
        </Heading>
        <Text
          fontSize="sm"
          color="gray.600"
          fontWeight="400"
          textAlign="center"
        >
          Past your text in the bellow section and it will generate{" "}
          <strong>Keyword</strong> for you. 🙂
        </Text>
      </VStack>
      <VStack my={4}>
        <Textarea w="full" h="auto" placeholder="Past your text here..." />
        <Button colorScheme="twitter">Generate Keyworld</Button>
      </VStack>
      <HStack
        w="full"
        textAlign="center"
        fontWeight="semibold"
        mt={3}
        justify="center"
      >
        <Text>Created by </Text>
        <Text
          cursor="pointer"
          color="green"
          textDecor="underline"
          onClick={() =>
            window.open("https://www.showwcase.com/devlopersabbir")
          }
        >
          @devlopersabbir
        </Text>
      </HStack>
    </Container>
  );
};

export default App;
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون تعدادی ایجاد کنید state استفاده كردن useState واکنش قلاب. من قصد دارم ایجاد کنم text حالت برای متن اعلان فروشگاه. و دومی است keyword حالتی که به ما کمک می کند تا داده های پاسخ خود را به عنوان کلمه کلیدی ذخیره کنیم. 3 است loading دولت برای ساختن spinner چه زمانی HTTP درخواست در انتظار است… و آخرین مورد است useDisclosure قلاب از @chakra-ui/react زیرا ما بعداً یک مودال ایجاد خواهیم کرد.

همچنین باید متنی را از آن بگیریم onChange روش. پس از آن، اکنون یک کنترل کننده کلیک را در دکمه تولید خود تنظیم کنید.

حالت

  const [text, setText] = useState<string>("");
  const [keyword, setKeyword] = useState<string>("");
  const [loading, setLoading] = useState<boolean>(false);
  const { isOpen, onOpen, onClose } = useDisclosure();
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

عملکرد هندلر

const generate = async () => {}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کد ما را به روز کنید

<Textarea
          onChange={(event: any) => setText(event.target.value)}
          w="full"
          value={text}
          h="auto"
          placeholder="Past your text here..."
        />
        <Button disabled={loading} colorScheme="twitter" onClick={generate}>
          {loading ? <Spinner /> : "Generate Keyword"}
        </Button>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

عملکرد ما باید ناهمگام باشد زیرا ما خواهیم ساخت HTTP درخواست.

ادغام OpenAI

اکنون می خواهیم api_key را برای تولید کلمه کلیدی خود ایجاد کنیم. ما از پلتفرم OpenAI استفاده خواهیم کرد. اگر حساب openAi دارید، اوکی کنید یا اگر نه، یک حساب جدید ایجاد کنید. و اکنون برای ایجاد کلید api به این آدرس بروید. برای ایجاد api_key روی من کلیک کنید.

توضیحات تصویر
کلید مخفی را کپی کرده و در هر جایی جایگذاری کنید زیرا دیگر این کلید را نخواهیم دید.

حالا یک متغیر در قسمت ایجاد کنید App.tsx فایل فراخوانی شد YOUR_API_KEY.

const YOUR_API_KEY = "Enter your secret key here...";
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

تا الان خیلی کارها را تمام کرده ایم. در این زمان ما آماده هستیم تا یک http درخواست با استفاده از axios و ما api key.

با استفاده از یک شی بسازید data متغیر برای داده های سریع

const datas: any = {
       model: "text-davinci-003",
       prompt: `Generate keyword from this text. Make the first latter of each word uppercase and separate with commas. The text is here: ${text}`,
       temperature: 0.5,
       max_tokens: 60,
       top_p: 1.0,
       frequency_penalty: 0.8,
       presence_penalty: 0.0,
     };
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون هدر خود را با توکن حامل تنظیم کنید.

 headers: {
            "Content-Type": "application/json",
            Authorization: `Bearer ${YOUR_API_KEY}`,
          },
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در اینجا کامل ما است App.tsx کد

import {
  Button,
  Center,
  Container,
  HStack,
  Heading,
  Image,
  Spinner,
  Text,
  Textarea,
  VStack,
  useDisclosure,
} from "@chakra-ui/react";
import { useState } from "react";
import Modals from "./components/Modals";
import axios from "axios";
import { toast } from "react-hot-toast";

const App = () => {
  const YOUR_API_KEY = "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";
  const [text, setText] = useState<string>("");
  const [keyword, setKeyword] = useState<string>("");
  const [loading, setLoading] = useState<boolean>(false);
  const { isOpen, onOpen, onClose } = useDisclosure();

  const generate = async () => {
    setLoading(true);
    const datas: any = {
      model: "text-davinci-003",
      prompt: `Generate keyword from this text. Make the first latter of each word uppercase and separate with commas. The text is here: ${text}`,
      temperature: 0.5,
      max_tokens: 60,
      top_p: 1.0,
      frequency_penalty: 0.8,
      presence_penalty: 0.0,
    };
    try {
      const { data } = await axios.post(
        "https://api.openai.com/v1/completions",
        datas,
        {
          headers: {
            "Content-Type": "application/json",
            Authorization: `Bearer ${YOUR_API_KEY}`,
          },
        }
      );
      const keyword = data.choices[0]?.text?.trim();
      toast.success("Keyword generated😍");
      setText("");
      onOpen();
      return setKeyword(keyword);
    } catch (error: any) {
      if (!error?.response?.data || !error?.response)
        return toast.error("Something went wrong!😒");

      const mess = error?.response.data?.message;
      if (mess) return toast.error(mess);
      toast.error("Fail to generate keyword😪");
    } finally {
      setLoading(false);
    }
  };
  return (
    <Container w="400px" h="auto" mx="auto" p={4}>
      <Center>
        <Image w="16" src="icon.png" alt="logo" />
      </Center>
      <VStack spacing={0} my={2}>
        <Heading as="h1" fontSize="xl" fontWeight="bold">
          Keyword Macker AI
        </Heading>
        <Text
          fontSize="sm"
          color="gray.600"
          fontWeight="400"
          textAlign="center"
        >
          Past your text in the bellow section and it will generate{" "}
          <strong>Keyword</strong> for you. 🙂
        </Text>
      </VStack>
      <VStack my={4}>
        <Textarea
          onChange={(event: any) => setText(event.target.value)}
          w="full"
          value={text}
          h="auto"
          placeholder="Past your text here..."
        />
        <Button disabled={loading} colorScheme="twitter" onClick={generate}>
          {loading ? <Spinner /> : "Generate Keyworld"}
        </Button>
      </VStack>
      <HStack
        w="full"
        textAlign="center"
        fontWeight="semibold"
        mt={3}
        justify="center"
      >
        <Text>Created by </Text>
        <Text
          cursor="pointer"
          color="green"
          textDecor="underline"
          onClick={() =>
            window.open("https://www.showwcase.com/devlopersabbir")
          }
        >
          @devlopersabbir
        </Text>
      </HStack>
      <Modals data={keyword} isOpen={isOpen} onClose={onClose} />
    </Container>
  );
};

export default App;

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توجه: همانطور که در اینجا می بینیم یک Modals جزء. اما ما هنوز مانند این کامپوننت را ایجاد نکرده ایم.
برای انجام این کار اجازه دهید یک پوشه کامپوننت در src -> component -> ایجاد کنیم و یک کامپوننت به نام ایجاد کنیم Modals.

بنابراین، در اینجا کد جزء معین ما است.

import {
  Button,
  Modal,
  ModalBody,
  ModalCloseButton,
  ModalContent,
  ModalFooter,
  ModalHeader,
  ModalOverlay,
  Text,
} from "@chakra-ui/react";
import { toast } from "react-hot-toast";

interface IModals {
  isOpen: boolean;
  onClose: () => void;
  data: string;
}

const Modals = ({ isOpen, onClose, data }: IModals) => {
  return (
    <Modal size="sm" isOpen={isOpen} onClose={onClose}>
      <ModalOverlay />
      <ModalContent>
        <ModalHeader>Keyword</ModalHeader>
        <ModalCloseButton />
        <ModalBody>
          <Text fontSize="lg" fontWeight="500">
            {data}
          </Text>
        </ModalBody>
        <ModalFooter>
          <Button colorScheme="blue" mr={3} onClick={onClose}>
            Close
          </Button>
          <Button colorScheme="green">
            Copy
          </Button>
        </ModalFooter>
      </ModalContent>
    </Modal>
  );
};

export default Modals;

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

همانطور که می بینیم در Modals جزء ما 3 پارامتر را به عنوان یک props دریافت می کنیم. همچنین از a استفاده می کنیم interface. با این حال اینو دیدی؟؟ ما داریم copy button😎
چیکار میکنی؟؟🤣
متاسفم برای سرگرمی زیاد ما یک عملکرد ساده برای کپی کردن خود ایجاد خواهیم کرد result keyword. باشه، بیایید ایجاد کنیم…

کلمه کلیدی را در کلیپ بورد کپی کنید

const handleCopyClick = async () => {
    try {
      await navigator.clipboard.writeText(data);
      toast.success("🚀 Keyword copied🥹");
    } catch (error) {
      toast.error("Fail to copy the keyword!");
    }
  };

// add replace copy button line with this line.
<Button onClick={handleCopyClick} colorScheme="green">
            Copy
          </Button>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

تمدید ما تموم شد😁
به هر حال، اگر می خواهید کد منبع کامل را در لینک Repo نمایه GitHub من مشاهده کنید. همچنین در اینجا لینک آموزش ویدیویی یوتیوب وجود دارد
.
.

نویسنده

نام کامل صابر حسین شوو. و نمایه GitHub https://github.com/devlopersabbir است.

برای پشتیبانی فقط برای من یک قهوه بخر
https://www.buymeacoffee.com/devlopersabbir

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا