मैंने एक अपेक्षाकृत छोटे एनपीएम पैकेज का निर्माण किया है जिसमें एक फाइल में लगभग 5 अलग-अलग ईएस 6 कक्षाएं शामिल हैं, वे सभी इस तरह से बहुत सुंदर दिखते हैं:
export default class MyClass {
// ...
}
फिर मैंने अपने पैकेज के लिए एक एंट्री पॉइंट सेटअप किया है जो इस तरह दिखता है:
export { default as MyClass } from './my-class.js';
export { default as MyOtherClass } from './my-other-class.js';
फिर मैंने वेबपैक और बेबल के माध्यम से प्रवेश बिंदु को चलाया है और एक ट्रांसप्लड और मिनिमाइज्ड इंडेक्स.जेएस के साथ समाप्त हो रहा है
पैकेज को स्थापित करना और आयात करना ठीक काम करता है, लेकिन जब मैं अपने क्लाइंट कोड से निम्न कार्य करता हूं:
import { MyClass } from 'my-package';
यह सिर्फ "MyClass" आयात नहीं करता है यह पूरी फाइल को आयात करता है जिसमें हर वर्ग की सभी निर्भरताएं शामिल हैं (मेरी कुछ कक्षाओं में बहुत बड़ी निर्भरताएं हैं)।
मुझे लगा कि जब आप पहले से ही बंडल पैकेज के कुछ हिस्सों को आयात करने का प्रयास करते हैं तो वेबपैक कैसे काम करता है? इसलिए मैंने अपने स्थानीय वेबपैक विन्यास को बाबेल के node_modules/my-package
माध्यम से चलाने के लिए स्थापित किया और फिर कोशिश की:
import { MyClass } from 'my-package/src/index.js';
लेकिन यहां तक कि यह index.js द्वारा निर्यात किए गए हर एक वर्ग को आयात करता है। केवल एक चीज जो मुझे लगता है कि यदि मैं चाहता हूं तो काम करना लगता है:
import MyClass from 'my-package/src/my-class.js';
लेकिन मैं इसके बजाय:
- Transpiled और minified फ़ाइल आयात करने में सक्षम हों, ताकि मुझे नोड_मॉड्यूस और के अंदर बेबल को चलाने के लिए वेबपैक को बताने की जरूरत न पड़े
- प्रत्येक फ़ाइल में पथ दर्ज करने के बजाय मेरे प्रविष्टि बिंदु से प्रत्येक व्यक्तिगत वर्ग को सीधे आयात करने में सक्षम हो
यहां सबसे अच्छा अभ्यास क्या है? अन्य लोग समान सेटअप कैसे प्राप्त करते हैं? मैंने देखा है कि GlideJS के पास इसके पैकेज का ESM संस्करण है, जो आपको उदाहरण के लिए इसके माध्यम से बेबल चलाने के बिना केवल उन चीजों को आयात करने की अनुमति देता है, जिनकी आपको आवश्यकता है।
प्रश्न में पैकेज: https://github.com/powerbuoy/sleek-ui
webpack.config.js
const path = require('path');
module.exports = {
entry: {
'sleek-ui': './src/js/sleek-ui.js'
},
output: {
filename: '[name].js',
path: path.resolve(__dirname, 'dist'),
library: 'sleek-ui', // NOTE: Before adding this and libraryTarget I got errors saying "MyClass() is not a constructor" for some reason...
libraryTarget: 'umd'
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: [
{
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
]
}
]
}
};
package.json
"name": "sleek-ui",
"version": "1.0.0",
"description": "Lightweight SASS and JS library for common UI elements",
"main": "dist/sleek-ui.js",
"sideEffects": false, // NOTE: Added this from Abhishek's article but it changed nothing for me :/
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack --mode production"
},
"repository": {
"type": "git",
"url": "git+https://github.com/powerbuoy/sleek-ui.git"
},
"author": "Andreas Lagerkvist",
"license": "GPL-2.0-or-later",
"bugs": {
"url": "https://github.com/powerbuoy/sleek-ui/issues"
},
"homepage": "https://github.com/powerbuoy/sleek-ui#readme",
"devDependencies": {
"@babel/core": "^7.8.6",
"@babel/preset-env": "^7.8.6",
"babel-loader": "^8.0.6",
"webpack": "^4.42.0",
"webpack-cli": "^3.3.11"
},
"dependencies": {
"@glidejs/glide": "^3.4.1",
"normalize.css": "^8.0.1"
}
}
import { MyClass } from 'my-package/src/MyClass';
। आप फ़ाइल पथ को छोटा करने के लिए src बिल्ड पैकेजिंग को भी हटा सकते हैं।
main
अपने परिवाद के पैकेज में (एंट्री पॉइंट) विशेषता जोड़ी थी। json? अपने बिल्ड में जांचें। और आप अपने परिवाद पैकेज को कैसे बांध रहे हैं?