Vue3+TS+Vite 搭建组件库记录

news2024/11/20 10:33:07

使用pnpm

安装

npm install pnpm -g

初始化package.json

pnpm init

新建配置文件 .npmrc

shamefully-hoist = true

这里简单说下为什么要配置shamefully-hoist

如果某些工具仅在根目录的node_modules时才有效,可以将其设置为true来提升那些不在根目录的node_modules,就是将你安装的依赖包的依赖包的依赖包的…都放到同一级别(扁平化)。说白了就是不设置为true有些包就有可能会出问题。

monorepo的实现

新建一个pnpm-workspace.yaml文件将我们的包关联起来,使各个项目之间能够互相引用

packages:
    - 'packages/**'
    - 'examples'

这样就能将我们项目下的packages目录和examples目录关联起来了,当然如果你想关联更多目录你只需要往里面添加即可。根据上面的目录结构很显然你在根目录下新packages和examples文件夹,packages文件夹存放我们开发的包,examples用来调试我们的组件

examples文件夹就是接下来我们要使用vite搭建一个基本的Vue3脚手架项目的地方

安装对应依赖

我们开发环境中的依赖一般全部安装在整个项目根目录下,方便下面我们每个包都可以引用,所以在安装的时候需要加个 -w

pnpm i vue@next typescript sass -D -w   //都是开发依赖

因为我们开发的是vue3组件, 所以需要安装vue3,当然ts肯定是必不可少的(当然如果你想要js开发也是可以的,甚至可以省略到很多配置和写法。但是ts可以为我们组件加上类型,并且使我们的组件有代码提示功能,未来ts也将成为主流);sass为了我们写样式方便

  • 配置tsconfig.json(tsconfig.json详细配置)

    • npx tsc --init将创建一个typescript默认配置文件tsconfig.json

    • declaration 用于指定是否在编译完成后生成相应的*.d.ts文件,默认为false

    • outdir 定义TS编译后的目录,如果没有声明,默认编译后的文件位置将和ts源文件在同一位置

npx tsc --init  //将创建一个typescript默认配置文件tsconfig.json

修改以下配置:

{
  "compilerOptions": {
    "baseUrl": ".",   // 解析非相对模块的基地址,默认是当前目录
    "jsx": "preserve", // 指定 jsx 格式
    "strict": true, // 开启所有严格的类型检查
    "target": "ES2015", // 目标语言的版本
    "module": "ESNext", // 生成代码的模板标准
    "skipLibCheck": true, //是否跳过声明文件的类型检查,这可以在编译期间以牺牲类型系统准确性为代价来节省时间,默认:false
    "esModuleInterop": true, // 允许export=导出,由import from 导入
    "moduleResolution": "node", // 模块解析策略,ts默认用node的解析策略,即相对的方式导入
    "lib": ["esnext", "dom"] // TS需要引用的库,即声明文件,es5 默认引用dom、es5、scripthost,如需要使用es的高级版本特性,通常都需要配置,如es8的数组新特性需要引入"ES2019.Array"
  }
}

手动搭建一个基于vite的vue3项目

其实搭建一个vite+vue3项目是非常容易的,因为vite已经帮我们做了大部分事情

初始化仓库

进入examples文件夹,执行

pnpm init

安装vite和@vitejs/plugin-vue

@vitejs/plugin-vue(Vue3 单文件组件支持)用来支持.vue文件的转译

pnpm install vite @vitejs/plugin-vue -D -w

这里安装的插件都放在根目录下

配置vite.config.ts(Vue Support)

新建vite.config.ts

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

export default defineConfig({
    plugins:[vue()]
})

新建html文件

@vitejs/plugin-vue 会默认加载examples下的index.html

新建index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app"></div>
    <script src="main.ts" type="module"></script>
</body>
</html>

注意: vite 是基于esmodule的 所以type=“module”

新建app.vue模板

<template>
    <div>
        启动测试
    </div>
</template>

新建main.ts

import {createApp} from 'vue'
import App from './app.vue'

const app = createApp(App)

app.mount('#app')

此时会发现编译器会提示个错误:找不到模块“./app.vue”或其相应的类型声明

因为直接引入.vue文件 TS会找不到对应的类型声明;所以需要新建typings(命名没有明确规定,TS会自动寻找.d.ts文件)文件夹来专门放这些声明文件。

typings/vue-shim.d.ts

TypeScriptTS默认只认ES 模块。如果你要导入.vue文件就要declare module把他们声明出来。

declare module '*.vue' {
    import type { DefineComponent } from "vue";
    const component:DefineComponent<{},{},any>
}

配置脚本启动项目

最后在package.json文件中配置scripts脚本

...
"scripts": {
    "dev": "vite"
  },
...

然后终端输入我们熟悉的命令:pnpm run dev

问题汇总

1)解决 Vite (Only file and data URLs are supported by the default ESM loader. Received protocol ‘node:‘)

解决:需要升级node

本地调试

新建包文件

本节可能和目前组件的开发关联不大,但是未来组件需要引入一些工具方法的时候会用到

接下来就是要往我们的packages文件夹冲填充内容了。

  • utils包

一般packages要有utils包来存放我们公共方法,工具函数等

既然它是一个包,所以我们新建utils目录后就需要初始化它,让它变成一个包;终端进入utils文件夹执行:pnpm init 然后会生成一个package.json文件;这里需要改一下包名,我这里将name改成@lime-ui/utils表示这个utils包是属于lime-ui这个组织下的。所以记住发布之前要登录npm新建一个组织;例如lime-ui

{
  "name": "@Lime-ui/utils",
  "version": "1.0.0",
  "description": "",
  "main": "index.ts",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "MIT"
}

因为我们使用ts写的,所以需要将入口文件index.js改为index.ts,并新建index.ts文件:(先导出一个简单的加法函数)

export const testfun = (a:number,b:number):number=>{
    return a + b
}
  • 组件库包(这里命名为lime-ui)

components是我们用来存放各种UI组件的包

新建components文件夹并执行 pnpm init 生成package.json

{
  "name": "lime-ui",
  "version": "1.0.0",
  "description": "",
  "main": "index.ts",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

新建index.ts入口文件并引入utils包

import {testfun} from '@lime-ui/utils'

const result = testfun (1,1)

console.log(result)
  • esno

由于组件库是基于ts的,所以需要安装esno来执行ts文件便于测试组件之间的引入情况

控制台输入esno xxx.ts即可执行ts文件

npm i esno -g

包之间本地调试

进入components文件夹执行

pnpm install @lime-ui/utils

你会发现pnpm会自动创建个软链接直接指向我们的utils包;此时components下的packages:

{
  "name": "lime-ui",
  "version": "1.0.0",
  "description": "",
  "main": "src/index.ts",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@lime-ui/utils": "workspace:^1.0.1"
  }
}

你会发现它的依赖@lime-ui/utils对应的版本为:workspace:^1.0.0;因为pnpm是由workspace管理的,所以有一个前缀workspace可以指向utils下的工作空间从而方便本地调试各个包直接的关联引用。

到这里基本开发方法我们已经知道啦;接下来就要进入正题了,开发一个button组件

问题汇总

1) pnpm install 包 时发现并没有出现workspace,只有版本号

解决:很大可能是因为包名重复,可以去npm官网搜索npm包名,找一个没用过的

试着开发一个button组件

在components文件夹下新建src,同时在src下新建button组件目录和icon组件目录(新建icon为了便于调试);此时components文件目录如下

-- components
  -- src
    -- button
    -- icon
    -- index.ts
-- package.json

让我们先测试一下我们的button组件能否在我们搭建的examples下的vue3项目本引用~

首先在button下新建一个简单的button.vue

<template>
    <button>测试按钮</button>
</template>

然后在button/index.ts将其导出

import Button from './button.vue'

export default Button

因为我们开发组件库的时候不可能只有button,所以我们需要一个components/src/index.ts将我们开发的组件一个个的集中导出

export { default as Button } from './button'

接着在components/index.ts 做如下配置

import * as components from './src/index'
export * from './src/index'
export default {
    install: (app: any) => {
        for (const comkey in components) {
            app.component((components as any)[comkey].name, (components as any)[comkey])
        }
    }
}

好了,一个组件的大体目录差不多就是这样了,接下来请进入我们的examples来看看能否引入我们的button组件

vue3项目使用button

上面已经说过执行在workspace执行 pnpm i xxx的时候pnpm会自动创建个软链接直接指向我们的xxx包。

所以这里我们直接在examples执行:pnpm i lime-ui

此时你就会发现packages.json的依赖多了个

"lime-ui": "workspace:^1.0.0"

这时候我们就能直接在我们的测试项目下引入我们本地的components组件库了,启动我们的测试项目,来到我们的 examples/app.vue 直接引入Button

<template>
    <div>
        <Button />
    </div>
</template>
<script lang="ts" setup>
import { Button } from 'lime-ui'
</script>

不出意外的话你的页面就会展示我们刚刚写的button组件了

好了万事具…(其实还差个打包,这个后面再说~);接下来的工作就是专注于组件的开发了;让我们回到我们的button组件目录下(测试页面不用关,此时我们已经可以边开发边调试边看效果了)

因为我们的button组件是需要接收很多属性的,如type、size等等,所以我们要新建个types.ts文件来规范这些属性

在button目录下新建types.ts

import { ExtractPropTypes } from 'vue'

export const ButtonType = ['default', 'primary', 'success', 'warning', 'danger']
export const ButtonSize = ['large', 'normal', 'small', 'mini'];

export const buttonProps = {
  type: {
    type: String,
    values: ButtonType
  },
  size: {
    type: String,
    values: ButtonSize
  }
}

export type ButtonProps = ExtractPropTypes<typeof buttonProps>

TIPS

import type 表示只导入类型;ExtractPropTypes是vue3中内置的类型声明,它的作用是接收一个类型,然后把对应的vue3所接收的props类型提供出来,后面有需要可以直接使用

很多时候我们在vue中使用一个组件会用的app.use 将组件挂载到全局。要使用app.use函数的话我们需要让我们的每个组件都提供一个install方法,app.use()的时候就会调用这个方法;

我们将button/index.ts调整为

import button from './button.vue'
import type {App,Plugin} from "vue"
type SFCWithInstall<T> = T&Plugin
const withInstall = <T>(comp:T) => {
    (comp as SFCWithInstall<T>).install = (app:App)=>{
        //注册组件
        app.component((comp as any).name,comp)
    }
    return comp as SFCWithInstall<T>
}
const Button = withInstall(button)
export default Button

此时我们就可以使用app.use来挂载我们的组件啦

其实withInstall方法可以做个公共方法放到工具库里,因为后续每个组件都会用到,这里等后面开发组件的时候再调整

到这里组件开发的基本配置已经完成,最后我们对我们的组件库以及工具库进行打包,打包之前如果要发公共包的话记得将我们的各个包的协议改为MIT开源协议

...
"license": "MIT",
...

vite打包

配置文件

打包这里选择vite,它有一个库模式专门为我们来打包这种库组件的。

前面已经安装过vite了,所以这里直接在components下直接新建vite.config.ts(配置参数文件中已经注释):

import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue"
export default defineConfig(
    {
        build: {
            target: 'modules',
            //打包文件目录
            outDir: "es",
            //压缩
            minify: false,
            //css分离
            //cssCodeSplit: true,
            
            // rollup配置
            rollupOptions: {
                //忽略打包vue文件
                external: ['vue'],
                input: ['src/index.ts'],
                output: [
                    {
                        format: 'es',
                        //不用打包成.es.js,这里我们想把它打包成.js
                        entryFileNames: '[name].js',
                        //让打包目录和我们目录对应
                        preserveModules: true,
                        //配置打包根目录
                        dir: 'es',
                        preserveModulesRoot: 'src'
                    },
                    {
                        format: 'cjs',
                        entryFileNames: '[name].js',
                        //让打包目录和我们目录对应
                        preserveModules: true,
                        //配置打包根目录
                        dir: 'lib',
                        preserveModulesRoot: 'src'
                    }
                ]
            },
            lib: {
                entry: './index.ts',
                formats: ['es', 'cjs']
            }
        },
        plugins: [
            vue()
        ]
    }
)

这里我们选择打包cjs(CommonJS)和esm(ESModule)两种形式,cjs模式主要用于服务端引用(ssr),而esm就是我们现在经常使用的方式,它本身自带treeShaking而不需要额外配置按需引入(前提是你将模块分别导出),非常好用~

其实到这里就已经可以直接打包了;components下执行: pnpm run build你就会发现打包了es和lib两个目录

在这里插入图片描述

到这里其实打包的组件库只能给js项目使用,在ts项目下运行会出现一些错误,而且使用的时候还会失去代码提示功能,这样的话我们就失去了用ts开发组件库的意义了。所以我们需要在打包的库里加入声明文件(.d.ts)。

那么如何向打包后的库里加入声明文件呢? 其实很简单,只需要引入vite-plugin-dts

pnpm i vite-plugin-dts -D -w

然后修改一下我们的vite.config.ts引入这个插件

import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue"
import dts from 'vite-plugin-dts'

export default defineConfig(
    {
        build: {...},
        plugins: [
            vue(),
            dts({
                //指定使用的tsconfig.json为我们整个项目根目录下掉,如果不配置,你也可以在components下新建tsconfig.json
                tsConfigFilePath: '../../tsconfig.json'
            }),
            //因为这个插件默认打包到es下,我们想让lib目录下也生成声明文件需要再配置一个
            dts({
                outputDir:'lib',
                tsConfigFilePath: '../../tsconfig.json'
            })

        ]
    }
)

因为这个插件默认打包到es下,我们想让lib目录下也生成声明文件需要再配置一个dts插件,暂时没有想到其它更好的处理方法~

然后执行打包命令你就会发现你的es和lib下就有了声明文件

其实后面就可以进行发布了,发布之前更改一下我们components下的package.json如下:

{
  "name": "lime-ui",
  "version": "1.0.0",
  "main": "lib/index.js",
  "module":"es/index.js",
  "scripts": {
    "build": "vite build"
  },
  "files": [
    "es",
    "lib"
  ],
  "keywords": [
    "lime-ui",
    "vue3组件库"
  ],
  "author": "小月",
  "license": "MIT",
  "description": "",
  "typings": "lib/index.d.ts"
}

解释一下里面部分字段

pkg.module

我们组件库默认入口文件是传统的CommonJS模块,但是如果你的环境支持ESModule的话,构建工具会优先使用我们的module入口

pkg.files

files是指我们1需要发布到npm上的目录,因为不可能components下的所有目录都被发布上去

开始发布

如何对 npm package 进行发包

做了那么多终于到发布的阶段了;其实npm发包是很容易的,就拿我们的组件库lime-ui举例吧

发布之前记得到npm官网注册个账户,如果你要发布@xx/xx这种包的话需要在npm新建个组织。组织名就是@后面的,比如我建的组织就是lime-ui,注册完之后你就可以发布了

首先要将我们代码提交到git仓库,不然pnpm发布无法通过,后面每次发版记得在对应包下执行 pnpm version patch你就会发现这个包的版本号patch(版本号第三个数) +1 了,同样的 pnpm version major major和 pnpm version minor 分别对应版本号的第一和第二位增加。

如果你发布的是公共包的话,在对应包下执行

pnpm publish --access public

输入你的账户和密码(记得输入密码的时候是不显示的,不要以为卡了)正常情况下应该是发布成功了

注意

  1. 发布的时候要将npm的源切换到npm的官方地址(registry.npmjs.org/); 如果你使用了其它镜像源的话
// 全局安装
npm install -g nrm
// 查看当前源
npm config get registry
// 切换淘宝源
nrm use taobao

// 切换npm源
nrm use npm

查看之后发现我之前直接设置的是淘宝源没有设置npm的源
npm config set registry https://registry.npmjs.org/

这样npm源就设置好了
然后,我们再次执行npm login
  1. 在npm下新建组织
    在这里插入图片描述
    在这里插入图片描述

问题汇总

1) 发布时402:

npm ERR! code E402
npm ERR! 402 Payment Required - PUT https://registry.npmjs.org/@okexchain%2ftruffle-plugin-verify - You must sign up for private packages

解决办法:npm publish --access public

也可以直接在package.json添加:

  "publishConfig": {
    "access": "public",
    "registry": "https://registry.npmjs.org/"
  },

2)发布时404

先去执行 npm init --scope=loops.org 参数根据自己的修改

npm init --scope=sakura-ui(新建组织名称)

在这里插入图片描述

3)发布时 403

非首次发布,需要修改版本号,命令行或package.json文件修改都可以

如果是首次发包,那么可能是和npm线上包重名了,到packages.json中修改包名,再次发布

在这里插入图片描述

更新发布

npm login
npm version patch  //version自增,例如从1.0.2自增到了1.0.3
最后,执行npm publish

代码规范化eslint&prettier

vue3+ts+vite 项目中eslint+prettier如何配置

eslint

1)安装依赖

pnpm i eslint eslint-plugin-vue @typescript-eslint/parser @typescript-eslint/eslint-plugin -D -w
  • eslint: ESLint 的核心代码。
  • eslint-plugin-vue:包含常用的 vue 规范。
  • @typescript-eslint/parser:ESLint 的解析器,用于解析 typescript,从而检查和规范 Typescript 代码。
  • @typescript-eslint/eslint-plugin:包含了各类定义好的检测 Typescript 代码的规范。
  • eslint-plugin-import:意在提供对ES6+ import/export语法的支持,有助于防止你写错文件路径或者引用的变量名

2)在package.json上添加一行命令
"lint": "eslint . --ext .vue,.js,.ts,.jsx,.tsx --fix"

4)创建一个.eslintrc.js文件

module.exports = {
  root: true,
  env: {
    browser: true,
    node: true,
    es6: true,
    //使用setup语法糖
    "vue/setup-compiler-macros": true,
    },
  extends: [
    'airbnb-base',
    "plugin:vue/vue3-essential",
    "plugin:vue/vue3-recommended",
    'plugin:@typescript-eslint/recommended',
  ],
  //这句不能少
  parser: "vue-eslint-parser",
  parserOptions: {
    ecmaVersion: "latest",
    parser: "@typescript-eslint/parser",
    sourceType: "module",
  },
  plugins: ["vue", "@typescript-eslint"],
  rules: {
    "vue/comment-directive": 0, //这句不能少不然报错
  }
};

4)添加 .eslintignore文件

node_modules
dist
pnpm-lock.yaml
.eslintrc.js

prettier

3)安装prettier

npm i -D prettier

4)配合ESLint检测代码风格

npm i eslint-plugin-prettier eslint-config-prettier -D -w
  • eslint-plugin-prettier:运行prettier代码格式化插件的配置。调用prettier对你的代码风格进行检查,其原理是先使用prettier对你的代码进行格式化,然后与格式化之前的代码进行对比,如果出现不一致,这个地方就会被prettier进行标记。

  • eslint-config-prettier:关闭一些不必要的或者是与prettier冲突的lint选项,这样我们就不会看到一些error出现两次。这里有个文档,列出了会与prettier冲突的配置项。

5).prettierrc.js 配置规则文件

module.exports = {
    // 行尾不需要有分号
    "semi": false,
    // 使用单引号
    "singleQuote": true,
    /* 
    overrides作用是指定A类文件使用B类文件作为分析器,如果遇到 No parser could be inferred for file 提示,
    则可以使用overrides解决。下面的意思是.prettierrc文件使用json分析器来格式化
    */
    "overrides": [
        {
            "files": ".prettierrc",
            "options": {
                "parser": "json"
            }
        }
    ]
}

6).prettierignore

.prettierignore 配置 prettier 忽略文件同.eslintignore一样

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/10817.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

防火墙安全策略

目录 一、包过滤技术 包过滤 安全策略 安全策略的原理 安全策略分类 二、防火墙的转发原理&#xff08;重点&#xff09; 首包流程 会话表 状态检测机制 会话在转发流程中的位置 多通道协议技术 ASPF 端口识别对多通道协议的支持 分片缓存 三、防火墙的安全策略配…

万应案例精选|跨壁垒、辅决策,万应低代码助力国网电力内部培训数字化架构升级

万应案例精选&#xff5c;跨壁垒、辅决策&#xff0c;万应低代码助力国网电力内部培训数字化架构升级一、项目背景 国网某省电力有限公司&#xff08;下称“国网电力”&#xff09;&#xff0c;是国家电网有限公司的全资子公司&#xff0c;现设20个职能部门&#xff0c;下设16…

智慧法院解决方案-最新全套文件

智慧法院解决方案-最新全套文件一、建设背景二、架构思路三、建设方案四、获取 - 智慧法院全套最新解决方案合集一、建设背景 智慧法院是指充分运用互联网、云计算、大数据、人工智能等技术&#xff0c;促进审判体系与审判能力现代化&#xff0c;实现人民法院 高度智能化的运行…

Java基础—普通阻塞队列

普通阻塞队列 除了刚介绍的两个队列&#xff0c;其他队列都是阻塞队列&#xff0c;都实现了接口BlockingQueue&#xff0c;在入队/出队时可能等待&#xff0c;主要方法有&#xff1a; 入队&#xff0c;如果队列满&#xff0c;等待直到队列有空间 void put(E e) throws Inter…

计算机毕业设计Python+Django的银行取号排队系统

项目介绍 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时…

MySQL之短时间提高性能的措施

文章目录前言短连接风暴慢查询QPS&#xff08;每秒查询数&#xff09;突增总结前言 我们在使用数据库的时候&#xff0c;总会有那么一段时间&#xff0c;数据库的压力会特别大。比如&#xff0c;用户的使用的高峰期&#xff0c;或者活动上线的时候等等。那么为了应对突然暴增的…

Child Tuning: 反向传播版的Dropout

这篇文章主要是对EMNLP2021上的论文Raise a Child in Large Language Model: Towards Effective and Generalizable Fine-tuning进行讲解。论文标题有些抽象&#xff0c;但是用作者的话来说&#xff0c;这篇论文的思想可以归结为两个词&#xff1a;Child Tuning 虽然这篇文章主…

0-1背包问题

在将什么是0-1背包问题前&#xff0c;先来看下面一道例题&#xff1a; 题意概要&#xff1a;有 n 个物品和一个容量为 W 的背包&#xff0c;每个物品有重量w i和价值v i两种属性&#xff0c;要求 选若干物品放入背包使背包中物品的总价值最大且背包中物品的总重量不超过背包的容…

京东一小伙一年输出20篇专利,其实你也可以

前言&#xff1a; ☆ 本文属于技术总结类干货分享&#xff0c;是实战但又不同于实战&#xff0c;所以不能保证每位同学读后都可以立马自己也输出一篇合格的专利&#xff1b; ☆ 但通过本文的总结分享&#xff0c;已经帮身边同学半年内输出大于100篇专利&#xff0c;所以如果你细…

【字母识别】基于matlab BP神经网络英文字母识别【含Matlab源码 2226期】

⛄一、BP神经网络英文字母识别 1 典型前向网络——BP神经网络 前向网络是目前研究最多的网络形式之一, 它包含输入层、隐层以及输出层, 其中隐层可以为一层或者多层 , 其结构如图1所示. 图1 BP神经网络模型 BP神经网络误差反向传播学习算法的基本思想如下:向网络提供训练例子…

智慧公路筑基者!天翼云打造全栈能力新底座

11月9日-11日&#xff0c;在第十七届中国智能交通年会&#xff08;ITSAC 2022&#xff09;暨2022中国智能交通大会上&#xff0c;中国电信作为本届大会特别支持单位&#xff0c;于11月10日成功举办了主题为“构建智慧公路全栈能力新底座”的运营商赋能智慧交通创新论坛。 交通运…

windows 安装ElasticSearch(es)可视化工具

因项目需要&#xff0c;小编这里使用的是 npm版本 6.14.16 nodejs版本14.19.1 1、下载nodejs地址&#xff1a;https://nodejs.org/download/release/v14.19.1/ 版本需要可根据自己电脑进行选择 2、下载可视化项目包 下载地址&#xff1a;https://github.com/mobz/elasticse…

2020年聚合支付评级结果及如何开展评级工作经验分享

一年一度的收单外包服务机构评级工作即将启动&#xff0c;笔者认为479家聚合支付机构也在关心本机构要不要进行评级并希望了解聚合支付评级要求、评级对机构有何意义和影响、目前聚合支付评级情况及如何开展评级工作。为此&#xff0c;基于笔者最近作为两家聚合支付机构常年顾问…

传奇脚本中提到的WIL序号是什么?在哪查看WIL序号?

传奇M2引擎设置WIL序号方便脚本<IMG:12:2>代码调用,在NPC对话界面显示图片信息。 传奇补丁文件WIL序号设置方法&#xff1a; 传奇M2-查看-列表信息二 很多脚本命令和功能都会使用这个WIL序号。 WIL序号的计算是从0开始的,例如下图中从0开始数 MonEffect.wzl的WIL文件序号…

专肽生物:蛋白激酶C底物 Protein Kinase C Substrate

蛋白激酶 C (PKC) 底物。编号: 161721 中文名称: 蛋白激酶C底物 Protein Kinase C Substrate CAS号: 105802-82-2 单字母: H2N-VRKRTLRRL-OH 三字母: H2N-Val-Arg-Lys-Arg-Thr-Leu-Arg-Arg-Leu-COOH 氨基酸个数: 9 分子式: C51H100N22O11 平均分子量: 1197.48 精确分子量: 1196…

北科天绘 16线3维激光雷达开发教程

文章目录前言一、配置IP地址二、ROS Driver1.创建工作空间并初始化2.启动雷达驱动程序三、 RVIZ 显示 R-Fans 点云数据前言 本教程使用的是三维激光雷达为北科天绘的R-Fans-16,采用网口连接传输数据&#xff0c;9-36V供电。 Ubuntu版本为20.04&#xff0c;Ros版本为Neotic。 !…

【长难句分析精讲】定语从句

1. 定语从句知识总结 1.基本概念&#xff1a; 先行词、关系词、不完整的句子2.先行词的形式&#xff1a; 名词、代词、名词短语、句子3.关系词的秘密 关系代词&#xff1a; 在从句中充当主(who, which, that, whom)、宾(which, that)、定语(whose)&#xff09;关系副词 &#…

送别金铁霖,被谷传民起诉,农民歌唱家大衣哥人品高下立判

最近一段时间&#xff0c;因为被著名作家兼编剧谷传民告上法庭&#xff0c;农民歌唱家大衣哥一夜之间人设崩塌。有人说大衣哥不讲武德&#xff0c;无偿使用别人的音乐&#xff0c;赚钱后又不支付版权费&#xff0c;农民歌唱家的人品真不咋样。 面对互联网铺天盖地的流言蜚语&am…

高斯判别分析(GDA)公式推导

解&#xff1a;将概率分布代入对数似然函数&#xff0c; l(ψ,μ0,μ1,∑)∑i1mlogpX∣Y(x(i)∣y(i);μ0,μ1,∑)∑i1mlogpY(y(i);ψ)l(\psi,\mu_0,\mu_1,\sum)\sum^m_{i1}{log{p_{X|Y}(x^{(i)}|y^{(i)};\mu_0,\mu_1,\sum)}}\sum^m_{i1}log{p_Y}(y^{(i)};\psi)l(ψ,μ0​,μ1​…

mbedtls 自带SSL demo调试

概述&#xff1a; 运行mbedtls自带 ssl demo的记录&#xff1b; 操作过程&#xff1a; 编译Demo&#xff0c;请看我专栏中的相关文章 先运行服务端程序&#xff0c;运行ssl_server.exe&#xff0c;运行结果如下&#xff1a; mbedtls-3.2.1\mbedtls-3.2.1\programs\ssl> .…