如何生成和使用用Typescript

时间:2018-05-02 21:11:59

标签: typescript npm module package

我已经有很长一段时间了,使用Typescript创建和使用NPM包很方便,但这些包基本上是作为单个模块提供和使用的。我现在想要发布包含多个模块的软件包,而不需要消费者在他们的代码中导入比他们想要的更多的软件包。

假设我的包src文件夹中有两个打字稿模块,一个位于文件one.ts中,另一个位于文件two.ts中:

one.ts:

export function talk() { console.log("Hello World"); };

two.ts:

export function talk() { console.log("Goodbye World"); };

现在,使用在Typescript中创建NPM包的最佳实践,我还在我的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
}

现在我发布该包并使用以下内容在typescript中使用它(当然,在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 :(得分:1)

你可以这样做:

.fixed-header {
  position: fixed;
  top: 0;
  left: 0;
  z-index: 2;
  width: 100%  !important;
}

.footer {
    position: fixed;
    left: 0;
    bottom: 0;
    width: 100%;
    color: white;
    text-align: center;
}