用 TypeScript 编写 npm 模块

2020-04-14 09:42:47

参考地址 用 TypeScript 编写 npm 模块

背景

自从开始使用 Node.js 已经一年多,写的代码越多,越是觉得自己提高的越慢。想来应该有没有将单一功能的代码封装在一个独立模块,而导致代码稍微多一点就维护困难的原因。

目标

最终目标

使用 TypeScript 编写一个 npm 模块,功能是通过 Express 中间件的形式对访问接口的用户进行操作鉴权。

目标分解

花了一下午的时间,想直接达到上面的最终目标,但是最后还是失败了。之前也经常会犯这样的错误,就是主观上不能接受自己能力差的事实,一次性目标定的太高,无法完成,心情低落,然后放弃。但我这次偏偏不放弃,而且以后也要吸取这次的教训。我这次把目标分解成一个个可以容易达到的小目标。

  • 用普通的 JavaScript 写一个最简单的 npm 模块;

  • 将刚才的 npm 模块加上一个 TypeScript 定义文件,使得 TypeScript 项目可以直接使用;

  • 使用 TypeScript 编写刚才的模块;

  • 使用 TypeScript 编写最终的功能模块;

用普通的 JavaScript 写一个最简单的 npm 模块

npm init 命令正常初始化一个项目,然后在 index.js 文件里编写如下内容。

exports.printMSG = function() {
  console.log('This message is from my npm module.');}

然后就可以直接发布在 npm 上了,前提是在 npm 上注册好了用户信息。

如果 npm 的仓库更换成立例如淘宝仓库等的其他仓库的话,需要先修改回 npm 官方仓库。

# npm config set registry https://registry.npmjs.org/

$ npm adduser # 添加 npm 用户信息$ npm config ls # 查看 npm 配置信息$ npm publish

就这样,一个全新的 npm 就发布上去了,就这样,一个小目标就先实现了。

原 npm 模块加上一个 TypeScript 定义文件

接着,再给这个 npm 模块加上一个 TypeScript 的说明文件,在项目根目录下建立一个 npm-js-demo.d.ts文件(任意名字都可以)。重要的是下一步,在 package.json 文件中加入以下一行,指明声明文件的位置。

"types": "npm-js-demo.d.ts"

然后修改版本号,再次发布。

$ npm version patch # 增加 patch 版本号,修改以后是 0.0.2$ npm publish

然后再建立一个新的项目,安装刚刚升级的 npm 模块做为依赖,即可以在项目中正常使用了。

import * as njd from 'node-js-demo';njd.printMSG();

增加辅助文件和内容

然后增加一些辅助的内容和文件,以便发布 npm 模块的时候屏蔽一些本地的设置或临时文件,

  • 增加 .gitignore 文件(如果没有 .npmignore 文件则默认使用该文件);

  • 增加 .npmignore 文件(可以覆盖 .gitignore 文件的设置);

  • 在 package.json 文件中增加 keywordsauthorrepository 等键值;

发布 npm 模块之前的本地化测试

为了防止发布的 npm 模块有问题而无法使用,应该首先在本地进行安装使用测试,具体流程如下,

在 npm-js-demo 项目下,运行命令。

npm install . -g

然后再其他测试项目中进行测试,

$ cd ../some-other-folder
$ npm install ../npm-js-demo

参考资料



  • 2020-11-22 20:56:13

    Dagger2使用详解

    简单的说,就是一个工厂模式,由Dagger负责创建工厂,帮忙生产instance。遵从Java规范JSR 330,可以使用这些注解。现在不研究Dagger2是如何根据注解去生成工厂的,先来看看工厂是什么东西,理解为什么可以实现了DI(Dependency Injection),如何创建IoC(Inverse of Control)容器。

  • 2020-11-22 21:00:28

    dagger.android--Fragment,BaseFragment

    1 使用Fragment参数来代替Activity参数 2 使用 @FragmentKey来代替@ActivityKey 3 使用HasFragmentInjector来代替@HasActivityInjector 4 AndroidInjection.inject(Fragment)方法,在Fragment的onAttach()中调用,而不是在onCreate()中 5 Fragment的Module添加位置,和Activity是不同的,它取决于Fragment需要的其他依赖注入

  • 2020-11-22 21:12:30

    Dependency Injection with Dagger2,Fragment

    標註@Provides的method若有parameter的話,Dagger會找出其擁有的該型態物件來使用。我們在Module內新增了DataModel將其列入Dagger的管理下,接著在provideFactory()增加parameter變成provideFactory(DataModel dataModel),Dagger就會找出其管理的DataModel給provideFactory使用。

  • 2020-11-22 22:58:52

    Android LiveData Transformations

    有时候有这样的需求,需要在LiveData将变化的数据通知给观察者前,改变数据的类型;或者是返回一个不一样的LiveData。

  • 2020-11-22 23:00:16

    androidx中的lifecycle组件

    Lifecycle-aware components生命周期感知组件执行操作,以响应另一个组件生命周期状态的更改,例如Activity和Fragment。这些组件可以帮助您生成更有组织、更容易维护的轻量级代码。

  • 2020-11-22 23:02:50

    Android数据存储之DataBase的Room

    Room是Google在AndroidX中提供的一个ORM(Object Relational Mapping,对象关系映射)库。它是在SQLite上提供的一个抽象层,可以使用SQLite的全部功能,同时可以更好更便捷流畅地访问数据库。(关于AndroidX可以参考

  • 2020-11-22 23:04:39

    Android组件 LiveData与MutableLiveData教程

    LiveData与ViewMode是经常搭配在一起使用的,但是为了不太混乱,我还是拆分开来说明,此篇博客只讲解 LiveData 与 MutableLiveData的概念与使用方式(但是会涉及到ViewMode的部分代码).

  • 2020-11-22 23:14:52

    Dagger 2 在 Android 上的用法

    在前面的文章我们介绍了Dagger2 中的大部分注解的使用,接下来我们从源码角度分析下第一篇文章中例子的原理。