做自己的npm包的过程记录

257 阅读4分钟

我是一个菜狗,记录的也只是一个流水账,请各位大佬不要嘲笑我,谢谢O(∩_∩)O

参考:blog.csdn.net/qq_40020447…

过程记录

ng new sand-search (我也不知道为啥取这么个名字)
cd sand-search    
ng g library hzz-sand-search --prefix=hzz
cd projects/hzz-sand-search/src/lib
ng g c search-box(新建需要的组件)
ng add ng-zorro-antd(装组件需要的各种依赖)
ng g c basic-map(另一个新组件)

修改父项目(sand-search)的angular.json,这样就可以用less啦

(同事大佬C:ng new的时候不是可以选吗?我:这不是new的时候没选吗?而且我看的教程也是这样改的!同事大佬C:笑哭.jpg)

    "hzz-sand-components": {
      "projectType": "library",
      "root": "projects/hzz-sand-components",
      "sourceRoot": "projects/hzz-sand-components/src",
      "prefix": "hzz",
      "schematics": {
        "@schematics/angular:component": {
          "style": "less"
        }
      },
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:ng-packagr",
          "options": {
            "project": "projects/hzz-sand-components/ng-package.json"
          },
          "configurations": {
            "production": {
              "tsConfig": "projects/hzz-sand-components/tsconfig.lib.prod.json"
            },
            "development": {
              "tsConfig": "projects/hzz-sand-components/tsconfig.lib.json"
            }
          },
          "defaultConfiguration": "production"
        },
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "main": "projects/hzz-sand-components/src/test.ts",
            "tsConfig": "projects/hzz-sand-components/tsconfig.spec.json",
            "karmaConfig": "projects/hzz-sand-components/karma.conf.js"
          }
        }
      }
    }

然后就开始尝试自己引自己了!

在父项目(sand-search)里加上import { HzzSandModule } from 'projects/hzz-sand-components/src/public-api';

结果报错,引不到,后来发现是没有export

public-api.ts也要加上导出

加上之后,在父项目(sand-dearch)的app.component里用,可以看到search-box works!就成功啦!

然后把之前写好的组件的代码复制过来,改吧改吧,search-box比较简单,basic-map用了本地的mapbox-gl.js,因为是同事大佬L改过的所以只能用这个,不能npm install mapbox(啊要是可以的话我三天前就把这个事情弄完了……),一开始我按照通义千问的说法,修改配置文件(详见最后面【和通义千问的聊天记录1】),后来发现打包会报错,找了很久的原因(被通义千问狠狠的骗),最后换了一种方法,也是通义千问给的建议,通过service的方式注入mapboxgl.js

import { Injectable } from "@angular/core";

declare let mapboxgl: any;
declare let script: any;
declare let turf:any;
@Injectable()
	export class MapboxGlService {
		private mapboxglLoaded = false;
		private mapboxglInstance: any;

		private turfLoaded = false;
		private turfInstance: any;

		constructor() { }

		public async initMapboxGL(path:string,mapToken:string): Promise<void> {
			// 加载Mapbox GL JS库文件
			const script = document.createElement('script');
			script.src = `${path}/mapbox-gl.js`; // 路径根据实际情况调整
			document.head.appendChild(script);

			const css = document.createElement('link');
			css.href = `${path}/mapbox-gl.css`; // 路径根据实际情况调整
			css.rel="stylesheet" ;
			css.type="text/css" 
			document.head.appendChild(css);
			// <link href="./pack/css/dicinfo.css" rel="stylesheet" type="text/css" />
			// 等待脚本加载完成
			await this.waitForScriptLoad(script);
			// await this.waitForScriptLoad(css);

			// 初始化accessToken
			mapboxgl.accessToken = mapToken;

			this.mapboxglLoaded = true;
			this.mapboxglInstance = mapboxgl;
			debugger
		}

		private async waitForScriptLoad(scriptElement: HTMLScriptElement): Promise<void> {
			return new Promise((resolve, reject) => {
				scriptElement.onload = () => resolve();
				scriptElement.onerror = () => reject(new Error('Failed to load Mapbox GL JS'));
			});
		}

		public async getMapboxGl(path:string,mapToken:string): Promise<any> {
			debugger
			if (!this.mapboxglLoaded) {
				await this.initMapboxGL(path,mapToken);
			}
			return this.mapboxglInstance;
		}


		public async initTurf(path:string): Promise<void> {
			// 加载Mapbox GL JS库文件
			const script = document.createElement('script');
			script.src = `${path}turf.min.js`; // 路径根据实际情况调整
			document.head.appendChild(script);



			// 等待脚本加载完成
			await this.waitForScriptLoad(script);

			this.turfLoaded = true;
			this.turfInstance = turf;
		}

		public async getTurf(path:string): Promise<any> {
			debugger
			if (!this.turfLoaded) {
				await this.initTurf(path);
			}
			return this.turfInstance;
		}
	}

在basic-map.component.ts里

在ngOnit里

    mapboxgl = await this.mapboxGlService.getMapboxGl(this.dependencePath, this.mapToken);
    turf = await this.mapboxGlService.getTurf(this.dependencePath);

然后就可以正常使用啦!

成功的能获取到mapboxgl后,按照通义千问的建议(又是你!!),用npm link来链接到其他的demo里,结果在build的时候又是一串报错,然后在库项目的ng-package.json里给依赖项们都配了全局umd啥啥啥的(详见和通义千问的聊天记录2)

结果又报错inject()啥啥啥的,又找了很久的原因,最后同事大佬C说是不是npm link的锅,在同事大佬C的建议下,直接ng build了npm publish!直接冲!结果就没有inject相关的报错了,可能就是npm link的问题吧……

ng build hzz-sand-components
cd dist\hzz-sand-components
npm adduser (第一次发布的情况)
npm login (如果没有到官网登录)
以上两个(adduser和login),输密码的时候看不到输入的效果是正常的!
npm publish

在demo中npm install hzz-sand-components拉下来,可以看到地图了,可太激动了,结果发现画面测面积的那个功能用不了,一看报错是没装mapbox-gl-draw,再一看库项目的package.json里没配依赖项相关的信息(什么这个居然需要自己手动写!不应该在装依赖的时候就自动长在这里吗!!)

先npm install @mapbox/mapbox-gl-draw,然后修改package.json

在库的父项目里serve,又报错找不到MapboxDraw的类型,vscode的建议是运行下面这行:

npm i --save-dev @types/mapbox__mapbox-gl-draw

确实能行。

在package.json里加上

    "@types/mapbox__mapbox-gl-draw": "1.4.6"   (这个版本号是直接在node_modules里去复制的)

然后又报找不到turf……(我怎么什么坑都踩一脚!!)

npm install turf了一下,发现在报错,仔细一看发现是我们用的版本太低了,有些方法新版本不支持了(但是这个方法名官网上又能搜到,奇奇怪怪的,不管了)

把turf.min.js也丢到mapbox-gl.service.ts里,按照mapbox.js的方法一起注入进来。

然后发现mapbox的css忘记带上了,也丢到mapbox-gl.service.ts里带进来……

然后又发现ant的样式打包的时候打不上,最终决定这样解决:

引来引去的也太麻烦了吧!!!!!!就这样了!!!!!!!!不管了!!!!!!!!

现在能行了!!!可以用了!!好耶!!!!!

和通义千问的聊天记录

和通义千问的聊天记录1

和通义千问的聊天记录2