用前端构建工具打包后端服务,我到底经历什么

node.js 能用 wepack打包么?node.js 代码可以打包成一个js 文件么?来这里看看吧

看到这个 标题,是的,我本是个后端,最近要写点 node.js, 之前写前端,知道 npm build 一下,那么用 javascript 写的后端程序也要 npm build 吧,好的,作为个 gopher , 带着对 javascript 的刻板印象就开干了。

我本 gopher,奈何没有一个会前端的老婆,就自己干前端了,如果干的不对,请及时纠正

项目背景

还是简单介绍下项目背景,屏幕前专业前端同学可以先猜猜这样干行还是不行,行的话,该怎么做。

这个程序运行的 node.js 端,提供一个简单的 http 服务,内部逻辑涉及:

  1. toml2json
  2. curl-to-go
  3. toml-to-go
  4. toml2xml
  5. xml2json
  6. json2toml

这些逻辑,可用内建包能解决,有些依赖第三方包,例如:

  1. json2toml
  2. object-to-xml

还有些组件,未提交到npm,也未做模块化处理,需要把代码找出来,单独处理,例如:

  1. curl-to-go
  2. toml-to-go

这些第三方包,感觉都是运行在前端环境的,(刚开始,我只是通过npm拉下来,也不知道能不能运行在 node.js 上,npm 也没指明这些包在前后端 runtime 兼容性)现在我想用 webpack 将其所有的代码打包成一个 js 文件,并能运行在 node.js 环境,

好,问题和背景如上。

别说:node.js 打什么包!

钟薛高 你还要不要

开整

我面临如下问题:

  1. 如何引入前端 包
  2. 如何引入 未模块化改造的包
  3. 如何让 webpack 编译的成果在 node.js 环境也能运行

关于第一个问题,首先得搞清楚在 Javascriptimportrequire 区别。

import 与 require 区别

require/exports 属于社区自己选举出的方案。import/export 属于是 ECMAScript 规范。

这里我们用到了 webpack , 那么就得使用 import/export 作为代码引入语法。所以,对 curl-to-go 代码改一下,在最后新增:

function curlToGo(curl) {
...
}

+ export default curlToGo;

这样就解决了,各个js文件组合问题。

第二个问题,需要弄清楚,node.js 的包管理机制

node.js 模块

node.js 模块管理,用的是 require ,由于我需要用 node.js 起一个 http 服务,需要使用 require 语句引入 http 模块。

但这还没完,webpack 是不能很好区分,哪些是外部依赖,哪些是内部依赖。所以这里需要告知 webpack :

module.exports = {

    target: "node", 

    }

第三个问题,那就随缘了,build之后,run一下试试咯。

最终 webpack 配置如下。

--- a/webpack.config.js
+++ b/webpack.config.js
@@ -1,5 +1,6 @@
 const path = require('path');
 const webpack = require('webpack');
+var fs = require("fs")

 /*
  * 引入 ParallelUglifyPlugin 插件
@@ -13,9 +14,20 @@ const PATHS = {
     build: path.join(__dirname, 'build'),
 };

+var nodeModules = {};
+fs.readdirSync('node_modules')
+    .filter(function(x) {
+        return ['.bin'].indexOf(x) === -1;
+    })
+    .forEach(function(mod) {
+        nodeModules[mod] = 'commonjs ' + mod;
+    });
+
 module.exports = {
     mode: 'development',
     devtool: false, // 编译成果 保留换行
+    target: "node",
+    externals: nodeModules,
     entry: {
         entry: path.join(__dirname, 'src/index.js'),
     },

最后

又是折腾前端的一天,哦不,是好几天。

javascript 和 node.js 包都放在 npm 里,有点让人搞不清楚适用环境,当然,这次引入的包都没有调用底层 API,所以,没出现兼容性问题。

importrequire 傻傻分不清楚,CommonJS, ES6ES5 各种标准算是给我好好上了一课。

好了,简单聊到这,不是太难的东西,只是表达一下一个刚入门前端的人碰到这些问题后的,“幸”路历程。

参考

  • https://zhuanlan.zhihu.com/p/28483358
  • https://sazzer.github.io/blog/2015/05/12/Javascript-modules-ES5-vs-ES6/
  • https://juejin.cn/post/6896397110078504973
  • https://zh.quish.tv/how-package-nodejs-application-using-webpack
  • https://blog.anymelon.com/2020/05-22-nodejs-webpack-record/
  • https://www.zhihu.com/question/56820346

又一 Golang Proto Toml SQL 转换神器

如何通过JSON生成Golang结构体代码,如何通过TOML生成Golang代码,如果通过SQL生成Golang代码,或者如何通过CURL生成Golang代码,来这里,一个网页所有功能一并打包给你

背景

在用 Golang 语言做“多”服务开发过程中,做了很多 CURD 业务, 静下来一琢磨发现:

  1. 出需求
  2. 按照需求建表
  3. 通过表定义 grpc 字段,也就是定义 proto 。
  4. proto 生成 pb.go 文件。
  5. 端口层出接口定义, json 格式。

就是把mysql字段提取出来,然后生成go结构体proto message 而已,于是就在想能否做个工具来解决这个问题。

笔者菜鸡,也就用 golang 搞搞 curd 啦~

所以,我就想有一款工具能够定义好 create table sql,就能自动创建出 proto 文件,json 结构体。

说干就干,不过磕磕绊绊,捣鼓了一年多,鸽了又鸽,终于面世了。

看着去年的提交,做这么个简单的东西也要那么久啊~

项目地址

访问 http://tools.itjsz.com

使用

SQL

  • 通过SQL 生成 Go struct, Proto

这里我们传入 WordPress 库的 wp_user 表。

暂不支持通过其他类型数据来生成 create table SQL

Yaml

  • 通过 yaml 生成其他格式数据

这里拿 k8s 创建 deploy 的yaml举例

Toml

  • 通过 Toml 转换成其他格式数据

项目中常常用 Toml 作为配置文件。这里我们传入 Toml 文本

其他类型

其他还有 jsonxmlproto 格式,就不再一一演示了,使用方法大同小异。

最后

产品已上线,欢迎大家体验,使用中遇到啥问题,或者有什么建议,通过下面工总号告诉我。

qrcode

Golang 打开浏览器 跨端方案

如何用Golang 代码唤起系统浏览器,以及在各个操作系统如何保证都能生效.官方又是怎么做的呢?

Golang 打开浏览器 跨端方案

Open browser on multi platform by Golang

用Golang 代码打开浏览器并访问网址,你用对了么?

放“码”过来

自动判断平台,生成跨端启动浏览器命令

// browsers returns a list of commands to attempt for web visualization.
func browsers() []string {
    var cmds []string
    if userBrowser := os.Getenv("BROWSER"); userBrowser != "" {
        cmds = append(cmds, userBrowser)
    }
    switch runtime.GOOS {
    case "darwin":
        cmds = append(cmds, "/usr/bin/open")
    case "windows":
        cmds = append(cmds, "cmd /c start")
    default:
        // Commands opening browsers are prioritized over xdg-open, so browser()
        // command can be used on linux to open the .svg file generated by the -web
        // command (the .svg file includes embedded javascript so is best viewed in
        // a browser).
        cmds = append(cmds, []string{"chrome", "google-chrome", "chromium", "firefox", "sensible-browser"}...)
        if os.Getenv("DISPLAY") != "" {
            // xdg-open is only for use in a desktop environment.
            cmds = append(cmds, "xdg-open")
        }
    }
    return cmds
}

启动浏览器并访问传入的网址

// open browser with url
func OpenBrowser(targetUrl string) (err error) {
    // Construct URL.
    u, _ := url.Parse(targetUrl)

    for _, b := range browsers() {
        args := strings.Split(b, " ")
        if len(args) == 0 {
            continue
        }
        viewer := exec.Command(args[0], append(args[1:], u.String())...)
        viewer.Stderr = os.Stderr
        if err = viewer.Start(); err == nil {
            return
        }
    }
    // No visualizer succeeded, so just print URL.
    fmt.Println(u.String())
    return
}

代码示例:

package main

import (
    "fmt"
    "net/url"
    "os"
    "os/exec"
    "runtime"
    "strings"
    "time"
)

func main() {
    openBrowser("http://blog.itjsz.com")
    time.Sleep(time.Second * 10)
}

初衷

当时我为了做一个开源项目—— https://github.com/PaulXu-cn/go-mod-graph-chart, 里面有个功能就是打开浏览器并访问 golang 启的 http 网页。在 Mac 下工作良好,在 Windows 下死活不唤起浏览器。

当时我查了好多资料,大多数给到我的信息是:

  • windows 下用 start
  • darwin Macopen
  • linux 统一用 xdg-open

windowsbash 环境是有点兼容性问题的。后来我用了 golang 的 pprof 工具,发现它也需要跨端唤起 浏览器,我就去研究了下它代码。

代码地址 —— google/pprof

好,希望这简短的文章能帮到你,解决 golang 跨端 唤起浏览器问题。

PS: 刚看了下,网上那么多正确方案,我抄错了,还带到了开源项目里,订在commit里面了,死死地那种。

参考

  • https://github.com/google/pprof
  • https://github.com/pkg/browser

Golang Eval 第三方实现

Golang作为静态语言,是否有Eval函数呢,今天,go-eval他来了

Go Eval 库

Golangeval() 函数第三方实现。

go eval

背景

众所周知,Golang 是一门静态语言,笔者作为动态语言转过来的老同志(别猜了我是phper),习惯了用 eval() 就想着Go 动态执行代码呢。

如何在 golang 中使用 eval() 函数,phpjavascript 自带该功能。golang 官方是没有提供相关库的。

在丰富的Go第三方生态中,着实没找到相关的库。倒是看到有人做了一个demo 挂到博客。我就来拿来改改,做成了一个库,望广大 gopher 用的满意。

安装

$ go get github.com/PaulXu-cn/goeval

功能介绍

这个 goeval 库,传入 golang 代码字符串,然后执行 eval() 函数,就能获得该 字符串代码 输出到 stdout 上的内容。

使用例子:

package main

import (
    "fmt"
    "github.com/PaulXu-cn/goeval"
)

func main() {
    if re, err := goeval.Eval(
        "",
        "fmt.Print(\"Hello http://blog.itjsz.com\")",
        "fmt"); nil == err {
        fmt.Print(string(re))
    } else {
        fmt.Print(err.Error())
    }
}

输出:

Hello http://blog.itjsz.com

这里我们引入了 goeval 包,调用它的 Eval 函数,第一个参数是,结构体定义代码(由于代码中没有有用自定义结构体,所有这里传空), 第二个字符串是要执行的代码,第三及以后的字符串是import的包。

实现细则

  1. 按照传入的字符串构建整个运行代码的字符串
  2. 格式化代码,主要是删除未使用 包,所以 import 的包可以多,但不能少。
  3. tmp 目录下随机创建一个目录,并进入
  4. 在刚创建目录里创建 main.go 文件
  5. 写入格式化后的代码
  6. 运行 go run main.go 并收集 stdout
  7. 删除创建的文件夹以及 main.go
  8. 返回 stdout

参考

  • https://golangtc.com/t/55b4ef18b09ecc22f6000219

【已解决】Laravel Class encrypter does not exist No supported encrypter found. The cipher

Laravel 报错加密类找不到。Class encrypter does not exist. No supported encrypter found.

Laravel 5.1 加密类找不到问题

Laravel 项目运行时,报错:

No supported encrypter found. The cipher and / or key length are invalid
Class encrypter does not exist

刚开始以为是,加密拓展没装好,实际上是app密钥没生成、配置到位。

解决否

已解决

方案

点断点, 断到: \Illuminate\Encryption\EncryptionServiceProvider::register

发现读取了配置,配置里面的 key 没初始化。

$ php artisan key:generate

$ php aritsan config:cache

生成的 key 要写入到配置文件里。这配置一般是在 /app/config.php 目录里,实际请按照个人项目来。

这里报错就是因为,随便写了一个字符串,长度不符合key的40长度,导致报错密钥长度不够。