Her biri bir dosyada bulunan kabaca 5 farklı ES6 sınıfından oluşan nispeten küçük bir NPM paketi inşa ettim, hepsi neredeyse şöyle görünüyor:
export default class MyClass {
// ...
}
Daha sonra paketim için aşağıdaki gibi bir giriş noktası ayarladım:
export { default as MyClass } from './my-class.js';
export { default as MyOtherClass } from './my-other-class.js';
Daha sonra webpack ve babil ile aktarılan ve küçültülmüş bir index.js ile biten giriş noktasını çalıştırdım
Paketin yüklenmesi ve içe aktarılması iyi çalışıyor, ancak istemci kodumdan aşağıdakileri yaptığımda:
import { MyClass } from 'my-package';
Sadece "Sınıfım" ı almakla kalmaz, her sınıfın tüm bağımlılıkları da dahil olmak üzere tüm dosyayı alır (bazı sınıflarımın büyük bağımlılıkları vardır).
Zaten paketlenmiş bir paketin parçalarını almaya çalıştığınızda web paketinin nasıl çalıştığını anladım? Bu yüzden yerel webpack yapılandırmamı babil node_modules/my-package
üzerinden çalışacak şekilde ayarladım ve denedim:
import { MyClass } from 'my-package/src/index.js';
Ancak bu bile index.js tarafından dışa aktarılan her sınıfı içe aktarır. İstediğim gibi çalışıyor gibi görünen tek şey, eğer:
import MyClass from 'my-package/src/my-class.js';
Ama daha doğrusu:
- Aktarılan ve küçültülmüş dosyayı içe aktarabilmek için node_modules içindeki babil'i çalıştırmak için webpack'e söylemem gerekmiyor
- Her dosyanın yolunu girmek yerine her bir sınıfı doğrudan giriş noktamdan içe aktarabilme
Buradaki en iyi uygulama nedir? Diğerleri benzer kurulumları nasıl gerçekleştirir? GlideJS'nin paketinin bir ESM sürümüne sahip olduğunu fark ettim.
Söz konusu paket: 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';
. Dosya yolunu kısaltmak için src derleme paketini de kaldırabilirsiniz.
main
(Giriş noktası) niteliğini lib'nizin package.json dosyasına eklediniz mi ? Yapınızı kontrol edin. Ve lib paketinizi nasıl paketliyorsunuz?