В течение довольно долгого времени мне было очень удобно создавать и использовать пакеты NPM с использованием Typescript, но эти пакеты по существу предоставлялись и использовались как единый модуль. Теперь я хотел бы опубликовать пакеты, содержащие более одного модуля, не требуя, чтобы потребитель импортировал больше этого пакета, чем он хочет, в своем коде.
Предположим, у меня есть два модуля машинописи в папке src моего пакета, один в файле one.ts, а другой в файле two.ts:
one.ts:
export function talk() { console.log("Hello World"); };
two.ts:
export function talk() { console.log("Goodbye World"); };
Теперь, используя лучшие методики создания пакета NPM в Typescript, я также создаю в своей папке src файл index.ts:
index.ts:
import * as one from "./one";
import * as two from "./two";
export { one, two };
И как в папке dist моего пакета будут находиться файлы index.js, index.d.ts, one.js, one.d.ts, two.js и two.d.ts (и, вероятно, также исходный код) файлы сопоставления, не относящиеся к этому вопросу).
Вот (несколько сокращенно) package.json:
{
"name": "my-package",
"version": "0.0.5",
"description": "",
"license": "UNLICENSED",
"main": "dist/",
"types": "dist/",
"scripts": {
"build": "tsc --skipLibCheck",
"prepublish": "yarn run build",
},
"keywords": [],
"dependencies": {},
"files": [
"src",
"dist"
]
}
И точно так же несколько сокращенный tsconfig.json:
{
"compilerOptions": {
"target": "es6",
"module": "es6",
"moduleResolution": "node",
"noImplicitAny": true,
"noEmitOnError": true,
"removeComments": false,
"declaration": true,
"outDir": "./dist",
"allowJs": false,
"sourceMap": true,
"typeRoots": [
"./node_modules/@types"
]
},
"include": [ "src/**/*" ],
"exclude": [ "node_modules" ],
"compileOnSave": false
}
Теперь я публикую этот пакет и использую его в машинописном тексте (после, конечно, npm -i) со следующим:
import * as conversation from "my-package"
conversation.one.talk(); // Hello World
conversation.two.talk(); // Goodbye World
Но теперь предположим, что я хочу импортировать ТОЛЬКО модуль one.ts. Я только когда-либо говорю «привет», а не «до свидания». ВАЖНО: я даже не хочу, чтобы "прощай" упаковывался в мой код потребления. (В моем случае я использую webpack для связывания кода потребления).
Так что я хочу как-то попросить импорт импортировать только one.ts. Мне все равно, как выглядит синтаксис, если я могу это сделать:
import * as greeting from "my-package.one"; // I know this doesn't work
greeting.talk();
Мне бы тоже очень хотелось сделать это:
import { talk } from "my-package.one"; // Again, I know this doesn't work
talk();
Я знаю, как это сделать, если пишу javascript и создаю мои собственные заголовочные файлы с окружающими модулями. Но я не хочу делать что-то подобное. Я просто хочу использовать модули как МОДУЛИ, которые явно присутствуют в пакете, как установлено в узлах-модулях.
Какие-нибудь указатели, которые могли бы предложить модификацию того, как я собираю многорежимный пакет и / или как я его потребляю?
Большое спасибо.