ईएस 6 में लिखे मॉड्यूल को एनपीएम में कैसे प्रकाशित करें?


144

मैं एनपीएम के लिए एक मॉड्यूल प्रकाशित करने वाला था, जब मैंने इसे भविष्य के प्रमाण के लिए ईएस 6 में इसे फिर से लिखने के बारे में सोचा, और 6-16 सीख लिया। मैंने ईएस 5 को ट्रांसपाइल करने, और परीक्षण चलाने के लिए बैबल का उपयोग किया है। लेकिन मुझे यकीन नहीं है कि आगे कैसे बढ़ना है:

  1. क्या मैं एनपीएम के परिणामस्वरूप / आउट फ़ोल्डर को ट्रांसपाइल करता हूं और प्रकाशित करता हूं?
  2. क्या मैं अपने गिथब रेपो में परिणाम फ़ोल्डर शामिल करता हूं?
  3. या मैं 2 रिपॉज बनाए रखता हूं, एक जीथुब के लिए ईएस 6 कोड + गल्प स्क्रिप्ट के साथ, और एक एनपीएम के लिए ट्रांसप्लेड परिणाम + परीक्षणों के साथ?

संक्षेप में: ईएस 6 में लिखे मॉड्यूल को एनपीएम में प्रकाशित करने के लिए मुझे क्या कदम उठाने की जरूरत है, जबकि अभी भी लोगों को मूल कोड को ब्राउज़ / फोर्क करने की अनुमति है?


मैं इस फैसले से हाल ही में जूझ रहा हूं। मैं जवाब देख रहा हूं कि आपने जोस द्वारा दिए गए जवाब को सर्वसम्मति से भी सही माना है।
ताल

यहाँ मेरा 2018 का उत्तर है , 2015 से मॉड्यूल समर्थन के साथ प्रगति को ध्यान में रखते हुए
दान Dascalescu

1
मुझे अच्छा लगेगा अगर मैं इसके विपरीत कर सकूं। NPM मॉड्यूल आयात करने के लिए ES मॉड्यूल का उपयोग करें, लेकिन ये एकमात्र परिणाम हैं जो मुझे मिलते हैं।
सीनएमसी

जवाबों:


81

अब तक मैंने जो पैटर्न देखा है, वह एक srcनिर्देशिका में es6 फाइलों को रखने के लिए है और निर्देशिका में npm के पूर्वप्रकाश में अपना सामान बनाने के लिए है lib

आपको .nignignore के समान .npmignore फ़ाइल की आवश्यकता होगी, लेकिन srcइसके बजाय अनदेखा कर रहा है lib


4
क्या आपके पास उदाहरण के भंडार हैं?
अहमद अब्बास

2
@JamesAkwuh ध्यान दें कि आप संभावित रूप से पैकेज में "स्टार्ट" और "बिल्ड" कमांड बदलना चाहेंगे। बाबेल-क्ली के सापेक्ष पथ का उपयोग करने के लिए ./node_modules/babel-cli/bin/babel.js -s inline -d lib -w src:। यह सुनिश्चित करना चाहिए कि नए वातावरण में तैनाती के दौरान इंस्टॉल विफल न हों।
फेजनिन्जा

2
@phazonNinja npm इसे संभालती है
जेम्स अकविउ

4
"अगर कोई .npmignore फ़ाइल नहीं है, लेकिन एक .gitignore फ़ाइल है, तो npm .ignignore फ़ाइल द्वारा भरी गई सामग्री को अनदेखा कर देगी।" आधिकारिक एनपीएम डॉक्स
फ्रैंक नॉक

10
इसके बजाय .npmignoreआप filespackage.json में फ़ील्ड का उपयोग कर सकते हैं । यह आपको उन फ़ाइलों को वास्तव में निर्दिष्ट करने देता है, जिन्हें आप प्रकाशित करना चाहते हैं, यादृच्छिक फ़ाइलों के लिए शिकार करने के बजाय जिन्हें आप प्रकाशित नहीं करना चाहते हैं।
डेन डैस्कलेस्कु

76

मुझे जोस का जवाब पसंद है। मैंने देखा है कि कई मॉड्यूल पहले से ही उस पैटर्न का पालन करते हैं। यहाँ आप इसे आसानी से Babel6 के साथ कैसे लागू कर सकते हैं। मैं babel-cliस्थानीय रूप से स्थापित करता हूं इसलिए यदि मैं कभी भी अपने वैश्विक बैबल संस्करण को बदलता हूं तो बिल्ड नहीं टूटता है।

.npmignore

/src/

.gitignore

/lib/
/node_modules/

बैबेल को स्थापित करें

npm install --save-dev babel-core babel-cli babel-preset-es2015

package.json

{
  "main": "lib/index.js",
  "scripts": {
    "prepublish": "babel src --out-dir lib"
  },
  "babel": {
    "presets": ["es2015"]
  }
}

29
scriptsवसीयत में किसी भी कमांड node_modules/.binको उनके साथ जोड़ा गया है $PATHऔर चूंकि babel-cliद्विआधारी स्थापित node_modules/.bin/babelकरने के लिए कमांड को पथ से संदर्भित करने की आवश्यकता नहीं है।
सुकिमा

3
कृपया ध्यान दें कि prepublishयह समस्याग्रस्त है क्योंकि यह स्थापित समय ( github.com/npm/npm/issues/3059 ) पर चल सकता है , अधिक मुहावरेदार versionस्क्रिप्ट हुक ( डॉक्स। Npmjs.com/cli/version ) को पसंद करें
मैटेकापू

@mattecapu ऐसा लगता है कि समस्या prepublishअभी भी है। फिलहाल मुझे लगता है कि srcनिर्देशिका को मैन्युअल रूप से संकलित करें और npm publishजाने का रास्ता है।
17

1
आप prepublishOnlyस्क्रिप्ट हुक का उपयोग कर सकते हैं (देखें docs.npmjs.com/misc/scripts#prepublish-and-prepare )। ध्यान दें कि npm के संस्करण 5 में यह अपेक्षित रूप से कार्य करना चाहिए, लेकिन अब (यह मानकर कि आप npm v4 + का उपयोग कर रहे हैं) यह काम करना चाहिए।
एलेक्स मान

1
@FrankNocke prepublishपहले publish(obv।) चलाता है , जो npm (या जहाँ भी आप कॉन्फ़िगर करते हैं) में सामान को धक्का देता है। तो यह एनपीएम पैकेज में जाता है, भले ही इसकी जाँच न की गई हो, इसके निर्माण के लिए।
साइमन बुकान

42

TL; DR - ~ अक्टूबर 2019 तक न करें। Node.js मॉड्यूल टीम ने पूछा :

कृपया Node.js द्वारा उपयोग के लिए कोई भी ES मॉड्यूल पैकेज प्रकाशित न करें [अक्टूबर 2019 तक]

2019 मई अपडेट

2015 से जब यह सवाल पूछा गया था, मॉड्यूल के लिए जावास्क्रिप्ट समर्थन काफी परिपक्व हो गया है, और उम्मीद है कि अक्टूबर 2019 में आधिकारिक तौर पर स्थिर होगा। अन्य सभी उत्तर अब अप्रचलित या अत्यधिक जटिल हैं। यहां वर्तमान स्थिति और सर्वोत्तम अभ्यास है।

ES6 समर्थन करते हैं

ES6 का 99% (उर्फ 2015) 6 संस्करण के बाद से नोड द्वारा समर्थित है । नोड का वर्तमान संस्करण 12 है। सभी सदाबहार ब्राउज़र ES6 सुविधाओं के विशाल बहुमत का समर्थन करते हैं। ECMAScript अब संस्करण 2019 में है , और संस्करण योजना अब वर्षों का उपयोग करने का पक्षधर है।

ES मॉड्यूल (उर्फ ECMAScript मॉड्यूल) ब्राउज़रों में

सभी सदाबहार ब्राउज़रों की है समर्थन import ES6 मॉड्यूल आईएनजी के बाद से 2017 गतिशील आयात कर रहे हैं समर्थित क्रोम से (+ कांटे ओपेरा और सैमसंग इंटरनेट की तरह) और सफारी। फ़ायरफ़ॉक्स समर्थन अगले संस्करण के लिए स्लेटेड है, 67।

मॉड्यूल लोड करने के लिए अब आपको वेबपैक / रोलअप / पार्सल आदि की आवश्यकता नहीं है । वे अन्य उद्देश्यों के लिए अभी भी उपयोगी हो सकते हैं, लेकिन आपके कोड को लोड करने के लिए आवश्यक नहीं हैं। आप सीधे ES मॉड्यूल कोड की ओर इशारा करते हुए URL आयात कर सकते हैं।

नोड में ईएस मॉड्यूल

ES मॉड्यूल ( / के .mjsसाथ फाइल ) को ध्वज के साथ कॉल करके Node v8.5.0 के बाद से समर्थित किया गया है । नोड वी 12, अप्रैल 2019 में जारी किया गया, प्रयोगात्मक मॉड्यूल समर्थन को फिर से लिखा गया। सबसे अधिक दृश्य परिवर्तन यह है कि आयात करते समय फ़ाइल एक्सटेंशन को डिफ़ॉल्ट रूप से निर्दिष्ट करने की आवश्यकता होती है:importexportnode--experimental-modules

// lib.mjs 

export const hello = 'Hello world!';

// index.mjs:

import { hello } from './lib.mjs';
console.log(hello);

अनिवार्य .mjsएक्सटेंशन पर ध्यान दें । ऐसे दोड़ो:

node --experimental-modules index.mjs

नोड 12 रिलीज तब भी होता है जब मॉड्यूल टीम ने डेवलपर्स से Node.js द्वारा उपयोग के लिए ईएस मॉड्यूल पैकेज प्रकाशित नहीं करने के लिए कहा था जब तक कि दोनों के माध्यम से पैकेज का उपयोग करने के लिए एक समाधान नहीं मिलता है require('pkg')और import 'pkg'। आप ब्राउज़रों के लिए अभी भी देशी ES मॉड्यूल प्रकाशित कर सकते हैं।

देशी ES मॉड्यूल का पारिस्थितिकी तंत्र समर्थन

मई 2019 तक, ईएस मॉड्यूल के लिए पारिस्थितिकी तंत्र का समर्थन अपरिपक्व है। उदाहरण के लिए, जेस्ट और अवा जैसी टेस्ट चौखटे समर्थन नहीं करती हैं --experimental-modules। आपको एक ट्रांसपिलर का उपयोग करने की आवश्यकता है, और फिर नामित आयात ( import { symbol }) सिंटैक्स (जो अभी तक अधिकांश एनपीएम पैकेजों के साथ काम नहीं करेगा) और डिफ़ॉल्ट आयात सिंटैक्स ( import Package from 'package') का उपयोग करने के बीच तय करना होगा , जो काम नहीं करता है, लेकिन जब बाबेल इसे पार्स नहीं करता है टाइपस्क्रिप्ट (ग्राफिकल-टूल्स, नोड-इनफ्लो, फॉस्ट आदि) में लिखे गए पैकेज के लिए , हालांकि एक वर्कअराउंड है जो दोनों के साथ काम करता है --experimental-modulesऔर यदि बैबेल आपके कोड को ट्रांसप्लेस करता है, तो आप इसे जेस्ट / अवा / मोसेक आदि के साथ टेस्ट कर सकते हैं:

import * as ApolloServerM from 'apollo-server'; const ApolloServer = ApolloServerM.default || ApolloServerM;

यकीनन बदसूरत, लेकिन इस तरह से आप अपने ईएस मॉड्यूल कोड को import/ के साथ लिख सकते हैं exportऔर इसे node --experimental-modulesट्रांसपॉयर्स के बिना चला सकते हैं। यदि आपके पास निर्भरताएं हैं जो ईएसएम-अभी तक तैयार नहीं हैं, तो उन्हें ऊपर के रूप में आयात करें, और आप टेस्ट फ्रेमवर्क और बाबेल के माध्यम से अन्य टूलिंग का उपयोग करने में सक्षम होंगे।


प्रश्न का पिछला उत्तर - याद रखें, जब तक नोड आवश्यक / आयात मुद्दे को हल नहीं करता, तब तक ऐसा न करें, उम्मीद है कि अक्टूबर 2019 के आसपास।

ईएस 6 मॉड्यूल को एनपीएम पर प्रकाशित करना, पीछे की संगतता के साथ

इतना है कि यह सीधे आयात किया जा सकता, कोलाहल या अन्य transpilers बिना npmjs.org के लिए एक ES मॉड्यूल प्रकाशित करने के लिए, बस बात mainअपने में क्षेत्र package.jsonके लिए .mjsफ़ाइल है, लेकिन विस्तार को छोड़ देते हैं:

{
  "name": "mjs-example",
  "main": "index"
}

बस यही बदलाव है। एक्सटेंशन को छोड़ने से, नोड एक mjs फ़ाइल के लिए सबसे पहले दिखेगा - अगर -एक्सपेरिमेंटल मॉड्यूल के साथ चलाया जाता है। अन्यथा यह .js फ़ाइल पर वापस आ जाएगा, इसलिए पुराने नोड संस्करणों का समर्थन करने के लिए आपकी मौजूदा ट्रांसप्लिकेशन प्रक्रिया पहले की तरह काम करेगी - बस बैबिल को इंगित करना सुनिश्चित करें।.mjs फ़ाइल फ़ाइल ।

यहाँ नोड <8.5.0 के लिए पीछे की संगतता के साथ एक मूल ईएस मॉड्यूल के लिए स्रोत है जिसे मैंने NPM को प्रकाशित किया है। आप इसे अभी उपयोग कर सकते हैं, बिना बेबल या किसी और चीज के।

मॉड्यूल स्थापित करें:

npm install local-iso-dt
# or, yarn add local-iso-dt

एक परीक्षण फ़ाइल test.mjs बनाएँ :

import { localISOdt } from 'local-iso-dt/index.mjs';
console.log(localISOdt(), 'Starting job...');

नोड - (v8.5.0 +)

node --experimental-modules test.mjs

टाइपप्रति

यदि आप टाइपस्क्रिप्ट में विकसित होते हैं, तो आप ES6 कोड उत्पन्न कर सकते हैं और ES6 मॉड्यूल का उपयोग कर सकते हैं:

tsc index.js --target es6 --modules es2015

फिर, आपको *.jsआउटपुट का नाम बदलने की आवश्यकता है .mjs, एक ज्ञात समस्या जो उम्मीद है कि जल्द ही ठीक हो जाएगी ताकि सीधे फ़ाइलों का tscउत्पादन हो सके .mjs


3
"सभी सदाबहार ब्राउज़र ईएस 6 सुविधाओं के विशाल बहुमत का समर्थन करते हैं।" जब आप डेटा को देखते हैं तो इसका मतलब यह नहीं है कि ब्राउज़रों में es6 समर्थन केवल सभी उपयोगकर्ताओं के लगभग 80% तक पहुंचता है।
पेड्रो पेड्रोसा

3
वर्तमान में, पारिस्थितिकी तंत्र निश्चित रूप से इसके लिए पर्याप्त परिपक्व नहीं है। V12 के विमोचन के साथ Node.js टीम ने विशेष रूप से पूछा: "कृपया Node.js द्वारा उपयोग किए जा रहे किसी भी ES मॉड्यूल पैकेज को प्रकाशित न करें जब तक कि यह हल न हो जाए।" 2ality.com/2019/04/nodejs-esm-impl.html#es-modules-on-npm मोचा मूल रूप से .mjs फ़ाइलों का समर्थन नहीं करता है। कई-कई पुस्तकालयों (जैसे क्रिएट-रिएक्शन-ऐप, रिएक्शन-अपोलो, ग्राफकल-जेएस) में mjsफाइलों के लिए निर्भरता के मुद्दे थे । अक्टूबर 2019 में Node.js को आधिकारिक समर्थन देने की योजना है जो जल्द से जल्द मैं इस पर फिर से विचार करूंगा।
itismydesign

3
@thisismydesign: इस पुराने उत्तर को अपडेट करने के लिए अनुस्मारक के लिए धन्यवाद! बस हो गया।
डैन डस्केल्सस्कु

17

@ जॉज सही है। NPM में ES6 / ES2015 को प्रकाशित करने में कुछ भी गलत नहीं है, लेकिन इससे परेशानी हो सकती है, खासकर यदि आपके पैकेज का उपयोग करने वाला व्यक्ति उदाहरण के लिए Webpack का उपयोग कर रहा है, क्योंकि आमतौर पर लोग node_modulesफ़ोल्डर को अनदेखा करते हैंbabel प्रदर्शन कारणों के लिए ।

तो, बस का उपयोग करें gulp, gruntया बस बनाने के लिए Node.jslib कि फ़ोल्डर ।

ये रहा मेरा build-lib.js स्क्रिप्ट है, जिसे मैं ./tools/(नहीं gulpया gruntयहाँ) रखता हूँ :

var rimraf = require('rimraf-promise');
var colors = require('colors');
var exec = require('child-process-promise').exec;

console.log('building lib'.green);

rimraf('./lib')
    .then(function (error) {
        let babelCli = 'babel --optional es7.objectRestSpread ./src --out-dir ./lib';
        return exec(babelCli).fail(function (error) {
            console.log(colors.red(error))
        });
    }).then(() => console.log('lib built'.green));

यहाँ एक अंतिम सलाह है: आपको अपनी परियोजना में एक .npmignore जोड़ने की आवश्यकता है । यदि npm publishयह फ़ाइल नहीं मिलती है, तो .gitignoreइसके बजाय इसका उपयोग किया जाएगा, जिससे आपको परेशानी होगी क्योंकि आम तौर पर आपकी .gitignoreफ़ाइल को बाहर करना ./libऔर शामिल करना होगा ./src, जो कि एनपीएम को प्रकाशित करते समय आप जो चाहते हैं उसके बिल्कुल विपरीत है। .npmignoreफ़ाइल के मूलतः एक ही वाक्य रचना है.gitignore (AFAIK)।


1
इसके बजाय .npmignoreआप filespackage.json में फ़ील्ड का उपयोग कर सकते हैं । यह आपको उन फ़ाइलों को वास्तव में निर्दिष्ट करने देता है, जिन्हें आप प्रकाशित करना चाहते हैं, यादृच्छिक फ़ाइलों के लिए शिकार करने के बजाय जिन्हें आप प्रकाशित नहीं करना चाहते हैं।
डेन डैस्कलेस्कु

क्या इस पेड़ को हिलाकर रख दिया जाएगा?
जो

मैं उपयोग .npmignoreकरने package.jsonकी सलाह नहीं देता , filesइसके बजाय प्रयास करें , देखें: github.com/c-hive/guides/blob/master/js/…
itismydesign

@thisismydesign: यह वही है जो मैंने ऊपर अपनी टिप्पणी में सुझाया था ..?
दान डैस्कलेस्क्यू

मेरा बुरा, ध्यान नहीं दिया :)
thisismydesign

8

जोस और मारियस के दृष्टिकोण के बाद, (2019 में बाबेल के नवीनतम संस्करण के अद्यतन के साथ): नवीनतम जावास्क्रिप्ट फ़ाइलों को एक src निर्देशिका में रखें, और npm के साथ बनाएँ prepublish स्क्रिप्ट और आउटपुट को ।

.npmignore

/src

.gitignore

/lib
/node_modules

बाबेल स्थापित करें (मेरे मामले में संस्करण 7.5.5)

$ npm install @babel/core @babel/cli @babel/preset-env --save-dev

package.json

{
  "name": "latest-js-to-npm",
  "version": "1.0.0",
  "description": "Keep the latest JavaScript files in a src directory and build with npm's prepublish script and output to the lib directory.",
  "main": "lib/index.js",
  "scripts": {
    "prepublish": "babel src -d lib"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@babel/cli": "^7.5.5",
    "@babel/core": "^7.5.5",
    "@babel/preset-env": "^7.5.5"
  },
  "babel": {
    "presets": [
      "@babel/preset-env"
    ]
  }
}

और मेरे पास src/index.jsएरो फंक्शन का उपयोग है:

"use strict";

let NewOneWithParameters = (a, b) => {
  console.log(a + b); // 30
};
NewOneWithParameters(10, 20);

यहाँ GitHub पर रेपो है

अब आप पैकेज प्रकाशित कर सकते हैं:

$ npm publish
...
> latest-js-to-npm@1.0.0 prepublish .
> babel src -d lib

Successfully compiled 1 file with Babel.
...

पैकेज को npm पर प्रकाशित करने से पहले, आप देखेंगे कि lib/index.jsइसे जनरेट किया गया है, जिसे es5 में ट्रांसप्लड किया गया है:

"use strict";

var NewOneWithParameters = function NewOneWithParameters(a, b) {
  console.log(a + b); // 30
};

NewOneWithParameters(10, 20);

[रोलअप बंडलर के लिए अपडेट]

जैसा कि @kyw द्वारा पूछा गया है, आप रोलअप बंडलर को कैसे एकीकृत करेंगे?

सबसे पहले, स्थापित करें rollupऔरrollup-plugin-babel

npm install -D rollup rollup-plugin-babel

दूसरा, rollup.config.jsप्रोजेक्ट रूट डायरेक्टरी में बनाएं

import babel from "rollup-plugin-babel";

export default {
  input: "./src/index.js",
  output: {
    file: "./lib/index.js",
    format: "cjs",
    name: "bundle"
  },
  plugins: [
    babel({
      exclude: "node_modules/**"
    })
  ]
};

अन्त में, अद्यतन prepublishमेंpackage.json

{
  ...
  "scripts": {
    "prepublish": "rollup -c"
  },
  ...
}

अब आप चला सकते हैं npm publish, और इससे पहले कि पैकेज npm पर प्रकाशित किया जाता है, आप देखेंगे कि lib / index.js उत्पन्न हो गए हैं, जो es5 में स्थानांतरित हो गया है:

'use strict';

var NewOneWithParameters = function NewOneWithParameters(a, b) {
  console.log(a + b); // 30
};

NewOneWithParameters(10, 20);

नोट: वैसे, अब @babel/cliआपको रोलअप बंडलर का उपयोग करने की आवश्यकता नहीं है । आप इसे सुरक्षित रूप से अनइंस्टॉल कर सकते हैं:

npm uninstall @babel/cli

आप रोलअप बंडल को कैसे एकीकृत करेंगे?
किव

1
@kyw, रोलअप बंडलर को कैसे एकीकृत करें, इसके बारे में मेरा अद्यतन जवाब देखें।
यूसी

दिसंबर 2019 अपडेट -> github.com/rollup/rollup/blob/…
a.barbieri

6

यदि आप इसे एक बहुत ही छोटे से खुले स्रोत नोड मॉड्यूल में कार्रवाई में देखना चाहते हैं, तो nth-day (जो मैंने शुरू किया था - अन्य योगदानकर्ताओं) पर एक नज़र डालें । Package.json फ़ाइल में और पूर्व-चरण चरण में देखें जो आपको यह करने के लिए ले जाएगा कि यह कहाँ और कैसे करना है। यदि आप उस मॉड्यूल को क्लोन करते हैं, तो आप इसे स्थानीय रूप से चला सकते हैं और इसे आपके लिए टेम्पलेट के रूप में उपयोग कर सकते हैं।


4

Node.js 13.2.0+ प्रयोगात्मक झंडे के बिना ईएसएम का समर्थन करता है और हाइब्रिड (ईएसएम और कॉमनजेएस) एनपीएम पैकेज (पिछड़ी संगतता के स्तर के आधार पर) प्रकाशित करने के लिए कुछ विकल्प हैं: https://2ality.com/2019 /10/hybrid-npm-packages.html

मैं आपके पैकेज के उपयोग को आसान बनाने के लिए पूर्ण पिछड़े संगतता तरीके से जाने की सलाह देता हूं। यह इस प्रकार दिख सकता है:

हाइब्रिड पैकेज में निम्नलिखित फाइलें हैं:

mypkg/
  package.json
  esm/
    entry.js
  commonjs/
    package.json
    entry.js

mypkg/package.json

{
  "type": "module",
  "main": "./commonjs/entry.js",
  "exports": {
    "./esm": "./esm/entry.js"
  },
  "module": "./esm/entry.js",
  ···
}

mypkg/commonjs/package.json

{
  "type": "commonjs"
}

आम से आयात:

const {x} = require('mypkg');

ईएसएम से आयात:

import {x} from 'mypkg/esm';

हमने 05.2019 में ईएसएम समर्थन में एक जांच की और पाया कि बहुत सारे पुस्तकालयों में समर्थन की कमी थी (इसलिए पिछड़ी अनुकूलता के लिए सिफारिश):


मैं नोड_मॉडल फ़ोल्डर (npm रूट -g द्वारा प्रदान) में विश्व स्तर पर स्थापित ES6 मॉड्यूल आयात नहीं कर सकता। क्या हम वास्तव में ऐसा करने में सक्षम नहीं हैं? मैं वास्तव में भ्रमित हूँ। मुझे पता है कि एनपीएम लिंक मॉड्यूल को मेरे स्थानीय नोड_मॉड्यूल फ़ोल्डर से लिंक करके समस्या को हल कर सकता है, लेकिन मैं जानना चाहता हूं कि वैश्विक नोड मॉड्यूल का आयात क्यों समर्थित नहीं है।
जोकिम एल। क्रिस्टियनसेन

अपने आप को उत्तर देते हुए, मुझे लगता है कि यह कभी भी समर्थित नहीं होगा: github.com/nodejs/node-eps/blob/master/… हालांकि यह वास्तव में एक मूर्खतापूर्ण निर्णय है, लेकिन समर्थन करना आसान होगा ...
जोकिम एल। क्रिस्टियनसेन

3

एनपीएम पैकेज के दो मानदंड यह है कि यह एक से अधिक कुछ नहीं के साथ प्रयोग करने योग्य है require( 'package' ) और कुछ सॉफ्टवेयर-ईश करता है।

यदि आप उन दो आवश्यकताओं को पूरा करते हैं, तो आप जो चाहें कर सकते हैं। यहां तक ​​कि अगर मॉड्यूल ES6 में लिखा गया है, अगर अंतिम उपयोगकर्ता को यह जानने की आवश्यकता नहीं है, तो मैं इसे अधिकतम समर्थन प्राप्त करने के लिए अभी तक स्थानांतरित कर दूंगा।

हालांकि, अगर कोआ की तरह , आपके मॉड्यूल को ES6 सुविधाओं का उपयोग करने वाले उपयोगकर्ताओं के साथ संगतता की आवश्यकता होती है, तो शायद दो पैकेज समाधान एक बेहतर विचार होगा।

ले जाओ

  1. केवल उतना ही कोड प्रकाशित करें जितना आपको require( 'your-package' )काम करने की आवश्यकता हो ।
  2. जब तक उपयोगकर्ता के लिए ES5 और 6 मामलों के बीच, केवल 1 पैकेज प्रकाशित करें। यदि आप इसे स्थानांतरित करना चाहिए।

1
इस सवाल का जवाब नहीं लगता है। मुझे लगता है कि ओपी यह पता लगाने की कोशिश कर रहा है कि उनके जीथब रेपो को कैसे संरचना करना है और एनपीएम को क्या प्रकाशित करना है और आप सभी ने कहा है कि वे जो चाहें कर सकते हैं। ओपी इस स्थिति के लिए एक अच्छे अभ्यास पर विशिष्ट सिफारिशें चाहता है।
jfriend00

@ jfriend00 मैं असहमत हूं। मैंने सिफारिश की है कि वह ट्रांसपाइल करें, और केवल उन फाइलों को प्रकाशित करें जो require( 'package' )काम करने के लिए आवश्यक हैं । मैं इसे और अधिक स्पष्ट करने के लिए अपने उत्तर को संपादित करूँगा। उस ने कहा, जोस का जवाब मेरे अपने से बहुत बेहतर है।
जोशविल

जोस का उत्तर बहुत अच्छा है, लेकिन मैं इस बात की सराहना करता हूं कि कब और क्यों एक बनाम दो पैकेज का उपयोग करना है, इसके लिए अच्छे नियमों का स्पष्ट रूप से उल्लेख करना।
जॉर्डन ग्रे

3

package.jsonएक बार प्रकाशित होने के बाद पैकेज में प्रवेश बिंदु तय करने में मुख्य कुंजी है । इसलिए आप जहां चाहें वहां अपना बैबेल का आउटपुट डाल सकते हैं और आपको mainकुंजी में सही रास्ते का उल्लेख करना होगा ।

"main": "./lib/index.js",

यहाँ npm पैकेज प्रकाशित करने के बारे में एक अच्छी तरह से लिखा गया लेख है

https://codeburst.io/publish-your-own-npm-package-ff918698d450

यहाँ एक नमूना रेपो है जिसे आप संदर्भ के लिए उपयोग कर सकते हैं

https://github.com/flexdinesh/npm-module-boilerplate


पद को छोड़ देता है तथ्य यह है कि आप (और चाहिए) कर सकते हैं कि NPM मॉड्यूल पर प्रकाशित ES6 में लेखक और importसीधे कोलाहल या किसी अन्य transpilers की आवश्यकता के बिना सक्षम।
दान डैस्कलेस्क्यू

0

आपके मॉड्यूल की शारीरिक रचना पर दोष, यह समाधान काम नहीं कर सकता है, लेकिन यदि आपका मॉड्यूल किसी एकल फ़ाइल के अंदर समाहित है, और इसकी कोई निर्भरता नहीं है ( आयात का उपयोग नहीं करता है ), तो निम्न पैटर्न का उपयोग करके आप अपना कोड जारी कर सकते हैं। , और आयात से आयात किया जा सकेगा (ब्राउज़र ES6 मॉड्यूल) और आवश्यकता के (नोड कॉमनज मॉड्यूल)

एक बोनस के रूप में, यह SCRIPT HTML एलिमेंट का उपयोग करके आयात किया जाना उचित होगा।

main.js :

(function(){
    'use strict';
    const myModule = {
        helloWorld : function(){ console.log('Hello World!' )} 
    };

    // if running in NODE export module using NODEJS syntax
    if(typeof module !== 'undefined') module.exports = myModule ;
    // if running in Browser, set as a global variable.
    else window.myModule = myModule ;
})()

माई-मॉड्यूल .js :

    // import main.js (it will declare your Object in the global scope)
    import './main.js';
    // get a copy of your module object reference
    let _myModule = window.myModule;
    // delete the the reference from the global object
    delete window.myModule;
    // export it!
    export {_myModule as myModule};

package.json : `

    {
        "name" : "my-module", // set module name
        "main": "main.js",  // set entry point
        /* ...other package.json stuff here */
    }

अपने मॉड्यूल का उपयोग करने के लिए, अब आप नियमित सिंटैक्स का उपयोग कर सकते हैं ...

जब NODE में आयात किया जाता है ...

    let myModule = require('my-module');
    myModule.helloWorld();
    // outputs 'Hello World!'

जब BROWSER में आयात किया जाता है ...

    import {myModule} from './my-module.js';
    myModule.helloWorld();
    // outputs 'Hello World!'

या यहां तक ​​कि जब एक HTML स्क्रिप्ट तत्व का उपयोग कर शामिल ...

<script src="./main.js"></script>
<script>
     myModule.helloWorld();
    // outputs 'Hello World!'
</script>

-1

किसी के लिए कुछ अतिरिक्त नोट्स, स्वयं के मॉड्यूल का उपयोग करके सीधे github, प्रकाशित मॉड्यूल से नहीं गुजरना :

( व्यापक रूप से इस्तेमाल किया गया ) "प्रीप्रकाश" हुक आपके लिए कुछ नहीं कर रहा है ।

सबसे अच्छी बात यह हो सकती है (यदि गीथब रिपोस पर भरोसा करने की योजना है, प्रकाशित सामग्री नहीं):

  • .npmignore srcसे अनलिस्ट करें (दूसरे शब्दों में: इसे अनुमति दें)। यदि आपके पास एक नहीं है .npmignore, तो याद रखें: .gitignoreइंस्टॉल की गई जगह के रूप में, की एक प्रति का उपयोग किया जाएगाls node_modules/yourProject जाएगा आपको दिखाई देगा।
  • सुनिश्चित करें, babel-cliआपके मॉड्यूल में एक सामंजस्य है, न कि केवल एक devDepenceny के बाद से आप ऐप डेवलपर कंप्यूटर पर खपत मशीन उर्फ ​​पर निर्माण कर रहे हैं, जो आपके मॉड्यूल का उपयोग कर रहा है
  • निर्माण कार्य करते हैं, स्थापित हुक में :

    "install": "babel src -d lib -s"

("प्रीइंस्टॉलेशन" की कोशिश में कोई अतिरिक्त मूल्य नहीं है, यानी बेबल-क्लि गायब हो सकता है)


3
इंस्टॉल पर कंपाइल बहुत अशिष्ट है। कृपया ऐसा न करें - npm स्थापित समय काफी खराब है! आंतरिक कोड के लिए जहां आप एनपीएम पैकेज रिपॉजिटरी का उपयोग करने से बचना चाहते हैं, आप कर सकते हैं: 1) एक मोनोरेपो का उपयोग करें, 2) अपलोड करें और npm packआउटपुट पर निर्भर करें , 3) बिल्ड आउटपुट में जांच करें।
साइमन बुकान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.