国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Home Web Front-end JS Tutorial Build and run your project in Monorepo with PNPM

Build and run your project in Monorepo with PNPM

Jan 19, 2025 pm 04:33 PM

Build and run your project in Monorepo with PNPM

Project code organization: Polyrepo vs. Monorepo

There are two main ways to organize project code:

  1. Polyrepo: Spread project code in different repositories. This is the current standard practice. Multiple teams have their own warehouses, build products and pipelines, and have autonomy.
  2. Monorepo: Centralizes all project code in one repository. Projects are divided into applications and packages to facilitate code reuse and share standard functionality, which helps unify third-party package versions, recursively build source code for dependencies, and use the same tools for CI/CD pipelines.

Monorepo is used by many large tech companies, such as Yandex. Monorepo helps share ideas and best practices among teams and business units. For more information about Monorepo and related tools, please visit http://m.miracleart.cn/link/b01ccf4f29b57b0b1bdb9407050db28d. This article will focus on a simple solution to build Monorepo using PNPM.

PNPM uses workspaces to integrate multiple projects in a single repository.

Environment setup

First, create an empty folder as a new Monorepo project. Initialize PNPM in the warehouse:

pnpm init

Then, create a pnpm-workspace.yaml file describing the package folder:

// pnpm-workspace.yaml

packages:
  - 'packages/**'
  - 'apps/**'
The

/packages folder holds shared libraries, and the /apps folder holds applications (for example, a standalone React Native mobile application and a web application that uses the same component or connection library to communicate with the API server).

This article will use a Telegram publishing robot as an example. Its source code is located on GitHub: http://m.miracleart.cn/link/8164ca2fe04767628ac1c6813e8a0867. Download and extract to /apps/publish-bot folder, then run the installation command:

pnpm install

Create Telegram Toolkit

Create a folder named /packages in the telegram-utils folder and initialize PNPM and TypeScript:

pnpm init && pnpm add -D typescript && pnpm tsc --init

This package will provide a function for combining text and captions from all messages (text, video and photo). Telegraf package needs to be installed:

pnpm add telegraf

All source code should be located in the /src directory. To facilitate functional grouping, it is recommended to create different folders. The function of combining text is located in the /texts folder, the code is as follows:

// packages/telegram-utils/src/texts/combineTexts.ts

import { Message } from 'telegraf/types';
import { FmtString, join } from 'telegraf/format';

type GroupedMessages = {
    photos: Array<Message.PhotoMessage>;
    videos: Array<Message.VideoMessage>;
    text: Array<Message.TextMessage>;
};

export const combineTexts = ({ photos, videos, text }: GroupedMessages) => {
    const photoTexts = photos
        .map(photo => photo.caption ? new FmtString(photo.caption, photo.caption_entities) : undefined)
        .filter((t): t is Required<FmtString> => t !== undefined);

    const videoTexts = videos
        .map(video => video.caption ? new FmtString(video.caption, video.caption_entities) : undefined)
        .filter((t): t is Required<FmtString> => t !== undefined);

    const allTexts = [];

    if (text.length) allTexts.push(join(text.map(t => new FmtString(t.text, t.entities))), '\n');
    if (photoTexts.length) allTexts.push(join(photoTexts, '\n'));
    if (videoTexts.length) allTexts.push(join(videoTexts, '\n'));

    return join(allTexts, '\n');
};

Code description:

  • The function inputs messages grouped by type: photo, video or text;
  • Media messages should be converted to FMT strings containing title and title entities. For subsequent filtering, undefined should be returned;
  • Concatenate text arrays step by step, eventually combining all texts into one large message.

Create an index file for the /texts folder:

pnpm init

Use the package.json field in the exports file to set up the export of the package function:

// pnpm-workspace.yaml

packages:
  - 'packages/**'
  - 'apps/**'

To identify Monorepo packages in your application, add the prefix @monorepo to all packages. Rename the package.json package in the telegram-utils file:

pnpm install

Add build script:

pnpm init && pnpm add -D typescript && pnpm tsc --init

Complete package.json file:

pnpm add telegraf

Configure the TypeScript compiler: enable incremental compilation to save build time and process only changed parts; enable compound compilation to use project references. Define the /src folder as rootDir and the package's outDir as /dist. Updated tsconfig.json:

// packages/telegram-utils/src/texts/combineTexts.ts

import { Message } from 'telegraf/types';
import { FmtString, join } from 'telegraf/format';

type GroupedMessages = {
    photos: Array<Message.PhotoMessage>;
    videos: Array<Message.VideoMessage>;
    text: Array<Message.TextMessage>;
};

export const combineTexts = ({ photos, videos, text }: GroupedMessages) => {
    const photoTexts = photos
        .map(photo => photo.caption ? new FmtString(photo.caption, photo.caption_entities) : undefined)
        .filter((t): t is Required<FmtString> => t !== undefined);

    const videoTexts = videos
        .map(video => video.caption ? new FmtString(video.caption, video.caption_entities) : undefined)
        .filter((t): t is Required<FmtString> => t !== undefined);

    const allTexts = [];

    if (text.length) allTexts.push(join(text.map(t => new FmtString(t.text, t.entities))), '\n');
    if (photoTexts.length) allTexts.push(join(photoTexts, '\n'));
    if (videoTexts.length) allTexts.push(join(videoTexts, '\n'));

    return join(allTexts, '\n');
};

Integration

Go back to /apps/publish-bot and add the @monorepo/telegram-utils package to dependencies. Note that you do not need to specify the package version, use workspace:* to indicate:

// packages/telegram-utils/src/texts/index.ts

export * from './combineTexts';

Install dependencies:

// packages/telegram-utils/package.json

"exports": {
    "./texts": {
        "import": "./src/texts/index.ts",
        "require": "./dist/texts/index.js"
    }
}

Update the preview command for publishing bots:

// packages/telegram-utils/package.json

"name": "@monorepo/telegram-utils"

Update/apps/publish-bot/tsconfig.json:

// packages/telegram-utils/package.json

"scripts": {
    "build": "tsc -p tsconfig.json"
}

Before building the application code, you need to build all dependencies:

// packages/telegram-utils/package.json

{
    "name": "@monorepo/telegram-utils",
    "version": "1.0.0",
    "main": "index.js",
    "scripts": {
        "build": "tsc -p tsconfig.json"
    },
    "keywords": [],
    "license": "ISC",
    "exports": {
        "./texts": {
            "import": "./src/texts/index.ts",
            "require": "./dist/texts/index.js"
        }
    },
    "devDependencies": {
        "typescript": "^5.7.3"
    },
    "dependencies": {
        "telegraf": "^4.16.3"
    }
}

Summary

The release bot now uses internal shared libraries/packages and is located in Monorepo. This makes it possible to quickly build new features and reuse code across multiple applications.

Image via Gabriel Heinzer on Unsplash

The above is the detailed content of Build and run your project in Monorepo with PNPM. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undress AI Tool

Undress AI Tool

Undress images for free

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Java vs. JavaScript: Clearing Up the Confusion Java vs. JavaScript: Clearing Up the Confusion Jun 20, 2025 am 12:27 AM

Java and JavaScript are different programming languages, each suitable for different application scenarios. Java is used for large enterprise and mobile application development, while JavaScript is mainly used for web page development.

Javascript Comments: short explanation Javascript Comments: short explanation Jun 19, 2025 am 12:40 AM

JavaScriptcommentsareessentialformaintaining,reading,andguidingcodeexecution.1)Single-linecommentsareusedforquickexplanations.2)Multi-linecommentsexplaincomplexlogicorprovidedetaileddocumentation.3)Inlinecommentsclarifyspecificpartsofcode.Bestpractic

How to work with dates and times in js? How to work with dates and times in js? Jul 01, 2025 am 01:27 AM

The following points should be noted when processing dates and time in JavaScript: 1. There are many ways to create Date objects. It is recommended to use ISO format strings to ensure compatibility; 2. Get and set time information can be obtained and set methods, and note that the month starts from 0; 3. Manually formatting dates requires strings, and third-party libraries can also be used; 4. It is recommended to use libraries that support time zones, such as Luxon. Mastering these key points can effectively avoid common mistakes.

Why should you place  tags at the bottom of the ? Why should you place tags at the bottom of the ? Jul 02, 2025 am 01:22 AM

PlacingtagsatthebottomofablogpostorwebpageservespracticalpurposesforSEO,userexperience,anddesign.1.IthelpswithSEObyallowingsearchenginestoaccesskeyword-relevanttagswithoutclutteringthemaincontent.2.Itimprovesuserexperiencebykeepingthefocusonthearticl

JavaScript vs. Java: A Comprehensive Comparison for Developers JavaScript vs. Java: A Comprehensive Comparison for Developers Jun 20, 2025 am 12:21 AM

JavaScriptispreferredforwebdevelopment,whileJavaisbetterforlarge-scalebackendsystemsandAndroidapps.1)JavaScriptexcelsincreatinginteractivewebexperienceswithitsdynamicnatureandDOMmanipulation.2)Javaoffersstrongtypingandobject-orientedfeatures,idealfor

What is event bubbling and capturing in the DOM? What is event bubbling and capturing in the DOM? Jul 02, 2025 am 01:19 AM

Event capture and bubble are two stages of event propagation in DOM. Capture is from the top layer to the target element, and bubble is from the target element to the top layer. 1. Event capture is implemented by setting the useCapture parameter of addEventListener to true; 2. Event bubble is the default behavior, useCapture is set to false or omitted; 3. Event propagation can be used to prevent event propagation; 4. Event bubbling supports event delegation to improve dynamic content processing efficiency; 5. Capture can be used to intercept events in advance, such as logging or error processing. Understanding these two phases helps to accurately control the timing and how JavaScript responds to user operations.

JavaScript: Exploring Data Types for Efficient Coding JavaScript: Exploring Data Types for Efficient Coding Jun 20, 2025 am 12:46 AM

JavaScripthassevenfundamentaldatatypes:number,string,boolean,undefined,null,object,andsymbol.1)Numbersuseadouble-precisionformat,usefulforwidevaluerangesbutbecautiouswithfloating-pointarithmetic.2)Stringsareimmutable,useefficientconcatenationmethodsf

How can you reduce the payload size of a JavaScript application? How can you reduce the payload size of a JavaScript application? Jun 26, 2025 am 12:54 AM

If JavaScript applications load slowly and have poor performance, the problem is that the payload is too large. Solutions include: 1. Use code splitting (CodeSplitting), split the large bundle into multiple small files through React.lazy() or build tools, and load it as needed to reduce the first download; 2. Remove unused code (TreeShaking), use the ES6 module mechanism to clear "dead code" to ensure that the introduced libraries support this feature; 3. Compress and merge resource files, enable Gzip/Brotli and Terser to compress JS, reasonably merge files and optimize static resources; 4. Replace heavy-duty dependencies and choose lightweight libraries such as day.js and fetch

See all articles