我为angular 2创建了一个打字稿库,便于访问我的后端服务。
到目前为止,它是一个私人仓库,但我想将它作为开源库上传到github并在npm上注册。
我现在不确定该怎么做,因为这个主题的文档不容易找到。
文件夹结构如下所示:
src
|--sdk.ts // entry point
|--services
|--auth.ts
|--database.ts
|--5 more ts files
|--utils
|--utils.ts
|--interfaces.ts
|--tests (8 ..spec.ts files)
我的入口点(sdk.ts)看起来像这样
import { NgModule, ModuleWithProviders } from '@angular/core';
import { Injectable } from '@angular/core';
import { SelfbitsDatabase } from './services/database';
import { SelfbitsAuth } from './services/auth';
import { SelfbitsAppConfig } from './utils/interfaces';
import { SelfbitsFile } from './services/file';
import { SelfbitsUser } from './services/user';
import { SelfbitsDevice } from './services/device';
import { SelfbitsPush } from './services/push';
import { HttpModule } from '@angular/http';
@Injectable()
export class SelfbitsAngular {
constructor(
public auth : SelfbitsAuth,
public database : SelfbitsDatabase,
public file : SelfbitsFile,
public user : SelfbitsUser,
public device: SelfbitsDevice,
public push : SelfbitsPush
){}
}
export const SELFBITS_PROVIDERS:any[] = [
SelfbitsAngular,
SelfbitsAuth,
SelfbitsDatabase,
SelfbitsFile,
SelfbitsUser,
SelfbitsDevice,
SelfbitsPush
];
@NgModule({
providers:SELFBITS_PROVIDERS,
imports:[ HttpModule ]
})
export class SelfbitsAngularModule{
static initializeApp(config:SelfbitsAppConfig):ModuleWithProviders{
return {
ngModule:SelfbitsAngularModule,
providers:[
{ provide: 'SelfbitsConfig', useValue: config }
]
}
}
}
这里的webpack.config.js并没有真正做到我想要的......
module.exports = {
entry:'./src/sdk.ts',
output:{
path: helpers.root('dist'),
filename:'selfbitsangular2sdk.js'
},
resolve: {
extensions: ['', '.js', '.ts']
},
module: {
loaders: [
{
test: /\.ts$/,
exclude:'/test/',
loaders: ['ts-loader']
}
]
}
};
我不确定webpack是否是正确的选择..或者应该捆绑和缩小或不缩小。欢迎任何提示和tipp!
干杯
答案 0 :(得分:3)
发布过程非常简单:
# Login with your existing npm user
npm login
# Bump library version
npm version --patch
# Publish your library
npm publish
最难的部分是正确准备package.json
的内容以及保存构建库的文件夹(将其命名为dist
的常用方法之一)。
您的dist
文件夹应包含可供Angular JIT项目以及Angular AOT项目使用的文件。它也应该包含您的库包,它可以直接被浏览器使用(让我们通过SystemJS说)。
结果您的dist文件夹应包含以下文件:
在这种情况下,您的package.json应通过main
,module
和typings
字段通知您的构建文件:
{
...
"main": "./dist/index.umd.js",
"module": "./dist/index.js",
"typings": "./dist/index.d.ts",
...
}
您可以在dist
文件夹中找到有关哪些文件的更详细说明以及如何在How to create AOT/JIT compatible Angular 4 library with external SCSS/HTML templates文章中编译它们
答案 1 :(得分:2)
对于那些仍在试图弄清楚如何做的人:
使用@ jvandemo' s Angular Lib Yeoman generator
之后您只需运行:import { Injectable } from '@angular/core';
import { RandomService } from '../random.service';
@Injectable()
export class SavedPostsService {
private _state: string;
public get state(): string {
return this._state;
}
public constructor(private _randomService: RandomService) {
this._state = this._randomService.generateStateString(20);
}
public getRedditAuthorizationUrl(): string {
reurn `https://www.reddit.com/api/v1/authorize?client_id=upw3i_YafZpoXw&response_type=code` +
`&state=${this.__state}` +
`&redirect_uri=http://localhost:4200/saved-posts&duration=temporary&scope=history`;
}
}
和npm adduser
答案 2 :(得分:1)
Angular大学有一个很好的,一步一步的教程,即向npm发布一个Angular 2库,解决您的疑虑/问题。
如果您愿意,可以提供捆绑和非捆绑版本,但我总是提供非捆绑版本。在我的库中,我没有提供捆绑版本,而是让消费者进行捆绑和缩小。
以下步骤将完成创建,测试和发布非捆绑角度模块的过程,供消费者使用捆绑器(webpack,angular cli等)消费。有关包括捆绑在内的更完整答案,请参阅@ OleksiiTrekhleb的答案。
发布一个角度2库可能会令人生畏,但是当它出现故障时,它与在NPM上发布任何其他软件包没有什么不同。以下信息将使用文件夹结构:
与任何打字稿库一样,您希望declaration
下的tsconfig.json
设置为compilerOptions
,以确保我们的消费者可以利用我们的包中的类型:
"declaration": true
在compilerOptions
中,我们还要指定我们的outDir
,以便将已编译的代码与源代码分开:
"outDir": "./dist"
我们希望include
选项指向我们的源文件夹(注意include
是与compilerOptions
相关的兄弟):
"include": [
"./src"
]
启用compilerOptions
下的实验装饰器选项:
"experimentalDecorators": true,
"emitDecoratorMetadata": true
为了避免在转换时出现一些错误,您还需要启用skipLibCheck
:
"skipLibCheck": true
<强>结果强>
{
"compilerOptions": {
"target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */
"module": "commonjs", /* Specify module code generation: 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
"skipLibCheck": true,
"declaration": true, /* Generates corresponding '.d.ts' file. */
"outDir": "./dist", /* Redirect output structure to the directory. */
"strict": true, /* Enable all strict type-checking options. */
"experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
"emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */
},
"include": [
"./src"
]
}
此示例将使用具有单个组件的模块。该组件非常直接:
./src/helloWorld/helloWorld.component.ts
import { Component } from "@angular/core";
@Component({
selector: 'hello-world',
template: '<div>Hello, world</div>'
})
export class HelloWorldComponent {
}
模块应将可消耗组件添加到declarations
和exports
。我们需要添加导出,因此当消费者导入我们的模块时,他们也可以使用我们的组件。
./src/helloWorld/helloWorld.module.ts
import { NgModule } from '@angular/core'
import { HelloWorldComponent } from './helloWorld.component';
const components: any[] = [
HelloWorldComponent
];
@NgModule({
declarations: components,
exports: components // Don't forget to export!
})
export class HelloWorldModule {
}
为了简化我们模块的导入,我们使用一个桶,该文件导出我们的消费者要消费的所有东西。
./src/index.ts
export { HelloWorldModule } from './helloWorld/helloWorld.module';
export { HelloWorldComponent } from './helloWorld/helloWorld.component';
<强>的package.json 强>
在package.json
中,将main
属性更改为指向已转换的桶./dist/index.js
。同时添加typings
属性以指向我们的桶定义文件./dist/index.d.ts
。
在prepublish
。
package.json
"scripts": {
"prepublish": "tsc"
}
另请注意,您的角度和相关依赖关系应位于peerDependencies
而不是dependencies
NPM忽略
在软件包的根目录中创建一个.npmignore
文件,忽略src
文件夹以及您不希望随软件包发布的任何其他文件
src/
*.log
您可以使用npm link在本地轻松测试您的npm包。在模块包文件夹中,运行命令npm link
。
然后在您的测试项目中,运行命令npm link <my package name>
现在您可以导入模块并将其添加到测试项目导入中,而无需发布。
现在可以使用简单的npm publish
发布您的包答案 3 :(得分:0)
我一直在和/写一些Angular(2+)库并且捆绑和发布过程总是很痛苦,我发现this tool完成所有工作并使库准备好发货使用ES5,ES6和CommonJS格式。
它非常容易使用,您只需在tsconfig中放入一个文件(入口文件),我将抓取您的所有文件并捆绑您的Angular库,它的内联样式和组件模板!
我认为这对其他人有用。
祝你好运。