Zbudowałem stosunkowo niewielki pakiet NPM składający się z około 5 różnych klas ES6 zawartych w jednym pliku, wszystkie wyglądają mniej więcej tak:
export default class MyClass {
// ...
}
Następnie skonfigurowałem punkt wejścia dla mojego pakietu, który wygląda następująco:
export { default as MyClass } from './my-class.js';
export { default as MyOtherClass } from './my-other-class.js';
Następnie uruchomiłem punkt wejścia przez webpack i babel, kończąc na transpilowanym i zminimalizowanym pliku index.js
Instalowanie i importowanie pakietu działa dobrze, ale gdy wykonam następujące czynności z kodu mojego klienta:
import { MyClass } from 'my-package';
Nie tylko importuje „MyClass”, ale importuje cały plik, w tym wszystkie zależności każdej klasy (niektóre z moich klas mają ogromne zależności).
Doszedłem do wniosku, że tak działa webpack, gdy próbujesz zaimportować części już dołączonego pakietu? Skonfigurowałem więc moją lokalną konfigurację webpacka, aby działała również node_modules/my-package
przez Babel, a następnie spróbowałem:
import { MyClass } from 'my-package/src/index.js';
Ale nawet to importuje każdą pojedynczą klasę eksportowaną przez index.js. Jedyne, co wydaje się działać tak, jak chcę, to jeśli:
import MyClass from 'my-package/src/my-class.js';
Ale wolałbym:
- Mogę zaimportować transpilowany i zminimalizowany plik, aby nie musiałem mówić webpackowi, aby uruchomił babel wewnątrz node_modules i
- Mogę importować każdą indywidualną klasę bezpośrednio z mojego punktu wejścia zamiast konieczności wprowadzania ścieżki do każdego pliku
Jaka jest tutaj najlepsza praktyka? Jak inni osiągają podobne ustawienia? Zauważyłem, że GlideJS ma wersję pakietu ESM, która pozwala importować tylko to, czego potrzebujesz, bez konieczności uruchamiania na przykład babel.
Pakiet, o którym mowa: 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']
}
}
]
}
]
}
};
pakiet.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';
. Możesz także usunąć pakiet kompilacji src, aby skrócić ścieżkę pliku.
main
atrybut (punkt wejścia) do pliku.jpg w bibliotece lib? Sprawdź swoją wersję. Jak pakujesz swój pakiet lib?