आपको esbuild जैसे बंडलर का उपयोग करना होगा जो आपके प्रोजेक्ट को संकलित करेगा और इसके साथ इसकी सभी निर्भरताओं को बंडल करेगा ताकि वे आयात न हों। यह ESM/CommonJS असंगति समस्या को दरकिनार कर देता है।
यदि आप अधीर हैं, तो आप इस उदाहरण कार्यान्वयन के साथ सीधे कोड पर जा सकते हैं।
सप्ताहांत में अपना नया प्रोजेक्ट टोकन.जेएस जारी करने की तैयारी करते समय, मुझे काफी निराशाजनक समस्या का सामना करना पड़ा। मैं चाहता था कि मेरा पैकेज ईएसएम के अलावा कॉमनजेएस का भी समर्थन करे, लेकिन मेरे पास शुद्ध ईएसएम निर्भरता थी। वहां के शुद्ध ईएसएम योद्धा मेरे ऐसा कहने से काफी नाखुश हो सकते हैं, लेकिन यदि आप एक एनपीएम पैकेज बना रहे हैं और चाहते हैं कि इसका व्यापक रूप से उपयोग किया जाए तो आपको अभी भी 2024 में कॉमनजेएस का समर्थन करने की आवश्यकता है।
टोकन.जेएस एक सरल टाइपस्क्रिप्ट एसडीके है जो आपको 9 विभिन्न प्रदाताओं (ओपनएआई, एंथ्रोपिक, कोहेयर, आदि) से 60 एलएलएम को एकीकृत करने की अनुमति देता है। बेशर्म प्लग, इसे जांचें और मुझे बताएं कि यदि आप जेनरेटिव एआई में रुचि रखते हैं तो आप क्या सोचते हैं।
अब ऑनलाइन कई संसाधन मौजूद हैं जो इस बात पर चर्चा कर रहे हैं कि ईएसएम, कॉमनजेएस या दोनों के लिए जावास्क्रिप्ट प्रोजेक्ट कैसे बनाएं। हालाँकि, मुझे विशेष रूप से इस तथ्य से निपटने में परेशानी हुई कि मेरी निर्भरताएँ शुद्ध ईएसएम थीं। मुझे इससे निपटना काफी कठिन लगा क्योंकि मैं बंडलर्स से परिचित नहीं हूं (मैंने ज्यादातर वेबएप बैकएंड पर काम किया है), और इस विषय पर एक अच्छा मार्गदर्शक नहीं ढूंढ पाया।
इसलिए यदि कोई और इस समस्या से जूझ रहा है, तो इसका समाधान यहां है।
हम बंडलर के लिए esbuild का उपयोग करेंगे।
yarn add esbuild --save-dev
हमें ईएसबिल्ड चलाने और परिणाम आउटपुट करने के लिए एक सरल बिल्ड स्क्रिप्ट की आवश्यकता होगी।
import esbuild from 'esbuild' const entrypoint = "" const tsconfig = " " const build = async () => { await Promise.all([ // bundle for commonjs esbuild.build({ entryPoints: [entrypoint], bundle: true, minify: true, format: 'cjs', outfile: `./dist/index.cjs`, platform: 'node', treeShaking: true, tsconfig, }), ]) } build()
अपने पसंदीदा रनटाइम के साथ चलाएं।
"scripts": { "build": "vite-node ./scripts/build.ts", }
मुझे व्यक्तिगत रूप से विटे-नोड पसंद है। इसलिए यदि आप वास्तव में इसका अनुसरण करना चाहते हैं, तो आपको इसे इंस्टॉल करना होगा:
yarn add vite-node --save-dev
yarn build
इससे आपका प्रोजेक्ट esbuild के साथ बनेगा और आपको एक नई फ़ाइल dist/index.cjs दिखाई देगी, जो आपके पैकेज का CommonJS बिल्ड है।
अपने CommonJS एंट्रीपॉइंट पर इंगित करने के लिए अपना package.json अपडेट करें।
"main": "dist/index.cjs",
बम! लीजिए, अब आपने CommonJS के लिए अपना पैकेज बना लिया है। यह तब भी काम करेगा जब आपके पास ESM निर्भरताएँ हों क्योंकि निर्भरताएँ बंडल की जाएंगी
आपके पैकेज के साथ।
जब esbuild को कॉल किया जाता है तो निर्भरता फ़ील्ड बंडल: सच के कारण आउटपुट में शामिल होती है।
हालाँकि तकनीकी रूप से इसकी आवश्यकता नहीं है, आप संभवतः टाइपस्क्रिप्ट घोषणाएँ भी चाहेंगे जो दुर्भाग्यवश इस समय आउटपुट नहीं देती है। तो उत्पन्न करने के लिए
वे, आप सामान्य tsc का उपयोग करना चाहेंगे।
इन विकल्पों को अपनी tsconfig.json फ़ाइल में जोड़ने से केवल टाइपस्क्रिप्ट घोषणाएँ आउटपुट होंगी। बाकी पैकेज के बाद से हम बिल्कुल यही चाहते हैं
esbuild के साथ बनाया जा रहा है।
"declaration": true, "declarationDir": "./dist", "emitDeclarationOnly": true
"scripts": { "build:tsc": "yarn tsc -p tsconfig.json", "build": "vite-node ./scripts/build.ts && yarn build:tsc", }
यह मार्गदर्शिका आपके पैकेज के लिए केवल एक कॉमनजेएस एंट्रीपॉइंट आउटपुट करने की अनुशंसा करती है। व्यक्तिगत रूप से, मुझे लगता है कि यह दो कारणों से सबसे अच्छा विकल्प है:
हालाँकि, यह एकमात्र विकल्प नहीं है। आप अपने पैकेज को CommonJS और ESM के लिए दोहरे प्रवेश बिंदुओं के साथ भी प्रकाशित कर सकते हैं।
import esbuild from 'esbuild' const entrypoint = "" const tsconfig = " " const build = async () => { await Promise.all([ // bundle for commonjs esbuild.build({ entryPoints: [entrypoint], bundle: true, minify: true, format: 'cjs', outfile: `./dist/index.cjs`, platform: 'node', treeShaking: true, tsconfig, }), // bundle for ESM esbuild.build({ entryPoints: [entrypoint], bundle: true, minify: true, format: 'esm', outfile: `./dist/index.js`, platform: 'node', treeShaking: true, tsconfig, }), ]) } build()
"main": "dist/index.cjs", "module": "dist/index.js", "type": "module", "exports": { ".": { "import": "./dist/index.js", "require": "./dist/index.cjs", "types": "./dist/index.d.ts" } },
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3