2022s

Sveltekit1.0后的使用感受

月盾

之前提到过关于svelte框架——sapper和sveltekit的发展,已经是1年前的事了,其中提到过svelte的框架sapper和sveltekit,sapper已经明确不再更新了,官方推荐的是sveltekit。然后经过两年的迭代更新,于2022年12月终于推出了1.0版本。可以看看官方博客对1.0的介绍Announcing SvelteKit 1.0

然后谈谈个人感受。

优点: sveltekit集成的还不错,开发体验可以,使用官方提供的脚手架创建的项目就可以直接使用,不需要做任何配置。热更新,响应速度快,支持typescript等等,该有的都有了。

缺点: 又是一个全新轮子,这也是整个前端的通病,除了js是通用的,其他的都能给你整出花来,sveltekit在1.0版本之内已经有破坏性的更新,一年前创建的新项目,一年后基本不能用了。

至于要不要使用,那就看个人情况了,如果你厌烦了其他框架,倒是可以尝尝鲜,如果你想以此来做长期项目的话,个人就不推荐了,毕竟太新,而且向下兼容又做的不好,隔三差五一个破坏性更新,这种折腾劲恐怕没几个人受得了。而且对自己的技术也不能积累,长此以往并没有好处。

sveltekit官方文档

Elasticsearch批量insert和批量upsert

月盾

golang版本的elasticsearch批量插入和批量更新方法如下:

package main

import (
  "github.com/elastic/go-elasticsearch/v8"
  "github.com/elastic/go-elasticsearch/v8/esutil"
)
func main()  {
  list:=make(User, 0)
  bulkES(list)
}

func bulkES(list []User) error {
	indexer, err := esutil.NewBulkIndexer(esutil.BulkIndexerConfig{
		Index:  "search-user",
		Client: ES,
	})
	if err != nil {
		return err
	}
	for _, v := range list {
		data, err := json.Marshal(v)
		if err != nil {
			return err
		}
		err = indexer.Add(
			context.Background(),
			esutil.BulkIndexerItem{
				Action: "index",
				Body:   bytes.NewReader(data),
			},
		)
		if err != nil {
			return err
		}
	}
	indexer.Close(context.Background())
	return nil
}

最简单版的代码整体上就是如此,但需要注意,该代码不适用于生产环境,只能作为测试。主要原因是indexer实例不能多次实例化,所以上面所示代码是一个函数,这个函数是不能多次调用,因为多次进行indexer实例化了,很快就会内存溢出崩溃掉。

正确的使用方式是在init函数或者连接elasticsearch后进行实例化一次,作为全局变量在后续使用,大概是这样:

package main

import (
  "github.com/elastic/go-elasticsearch/v8"
  "github.com/elastic/go-elasticsearch/v8/esutil"
)
var userindexer esutil.BulkIndexer

func init() {
  indexer, err := esutil.NewBulkIndexer(esutil.BulkIndexerConfig{
		Index:  "search-user",
		Client: ES,
	})
  if err != nil {
		return err
	}
  userindexer = indexer
}
func bulkES(list []User) error {
	for _, v := range list {
		data, err := json.Marshal(v)
		if err != nil {
			return err
		}
		err = userindexer.Add(
			context.Background(),
			esutil.BulkIndexerItem{
				Action: "index",
				Body:   bytes.NewReader(data),
			},
		)
		if err != nil {
			return err
		}
	}
	// userindexer.Close(context.Background())
	return nil
}

注意: 代码只做演示使用,不保证能正确运行。

go http响应乱码

月盾

golang请求接口返回的数据乱码,原因之一是请求头设置了"Accept-Encoding": "gzip, deflate, br",那么如果服务器支持的话响应的数据就会经过gzipdeflatebr等方式的压缩,解决方式是对数据解压,或者可以不设置接收方式,即"Accept-Encoding": ""

import "github.com/andybalholm/brotli"
import "compress/flate"
import "compress/gzip"
// 检测返回的body是否经过压缩,并返回解压的内容
func contentDecoding(res *http.Response) (bodyReader io.Reader, err error) {
	switch res.Header.Get("Content-Encoding") {
	case "gzip":
		bodyReader, err = gzip.NewReader(res.Body)
	case "deflate":
		bodyReader = flate.NewReader(res.Body)
	case "br":
		bodyReader = brotli.NewReader(res.Body)
	default:
		bodyReader = res.Body
	}
	return
}

chrome开发者工具显示接口完整路径

月盾

chrome浏览器的开发者工具是前端开发必不可少的工具,其中接口查看是最常用的功能之一。默认情况下显示如下: chrome开发者工具

主要是红框内的接口显示只有很短的名称,并没有完整的显示出整个接口,这对于一些最后名称一样的接口就不能知晓是哪个接口了,只能点击查看详情。我们希望的当然是能够显示完整的接口,实际上也是能做到的。

在名称栏上右击:

chrome开发者工具

可以显示很多选项,其中路径和网址就是我们先要的,点击以后就可以显示完整的接口路径了。

chrome开发者工具