Как производить и использовать многомодульные пакеты NPM, написанные на Typescript - PullRequest
0 голосов
/ 03 мая 2018

В течение довольно долгого времени мне было очень удобно создавать и использовать пакеты 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 и создаю мои собственные заголовочные файлы с окружающими модулями. Но я не хочу делать что-то подобное. Я просто хочу использовать модули как МОДУЛИ, которые явно присутствуют в пакете, как установлено в узлах-модулях.

Какие-нибудь указатели, которые могли бы предложить модификацию того, как я собираю многорежимный пакет и / или как я его потребляю?

Большое спасибо.

1 Ответ

0 голосов
/ 03 мая 2018

Вы можете сделать:

import { talk } from "my-package/dist/one"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...