Tôi đã xây dựng một gói NPM tương đối nhỏ bao gồm khoảng 5 lớp ES6 khác nhau được chứa trong một tệp, mỗi tệp trông khá giống nhau như sau:
export default class MyClass {
// ...
}
Sau đó, tôi đã thiết lập một điểm vào cho gói của mình trông như thế này:
export { default as MyClass } from './my-class.js';
export { default as MyOtherClass } from './my-other-class.js';
Sau đó, tôi đã chạy điểm vào thông qua webpack và babel kết thúc với một index.js được dịch mã và rút gọn
Cài đặt và nhập gói hoạt động tốt, nhưng khi tôi thực hiện các thao tác sau từ mã máy khách của mình:
import { MyClass } from 'my-package';
Nó không chỉ nhập "MyClass" mà nó nhập toàn bộ tệp bao gồm tất cả các phụ thuộc của mỗi lớp (một số lớp của tôi có phụ thuộc rất lớn).
Tôi hình dung đây là cách webpack hoạt động khi bạn cố gắng nhập các phần của gói đã được gói? Vì vậy, tôi đã thiết lập cấu hình webpack cục bộ của mình để chạy node_modules/my-package
qua babel và sau đó thử:
import { MyClass } from 'my-package/src/index.js';
Nhưng ngay cả điều này cũng nhập mọi lớp đơn được xuất bởi index.js. Điều duy nhất có vẻ hoạt động theo cách tôi muốn là nếu tôi làm:
import MyClass from 'my-package/src/my-class.js';
Nhưng tôi muốn nói nhiều hơn:
- Có thể nhập tệp được sao chép và rút gọn để tôi không phải yêu cầu webpack chạy babel bên trong node_modules và
- Có thể nhập từng lớp riêng lẻ trực tiếp từ điểm vào của tôi thay vì phải nhập đường dẫn đến từng tệp
Thực hành tốt nhất ở đây là gì? Làm thế nào để những người khác đạt được các thiết lập tương tự? Tôi đã nhận thấy GlideJS có phiên bản ESM của gói cho phép bạn chỉ nhập những thứ bạn cần mà không phải chạy babel qua nó.
Gói trong câu hỏi: 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']
}
}
]
}
]
}
};
pack.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';
. Bạn cũng có thể loại bỏ bao bì xây dựng src để rút ngắn đường dẫn tệp.
main
(điểm vào) trong gói.j.j của lib chưa? Kiểm tra bản dựng của bạn. Và làm thế nào bạn đang gói gói lib của bạn?