Windows下Electron 执行 exec console输出stderr 乱码

windows下用Electron启动别的二进制程序,打印报错信息是乱码

electron nodejs exec windows 下 stderr 乱码

解决否

已解决

方案

原因 :出现原因 , 因为CMD默认的是gbk2312 编码 , 而nodejs 默认的是utf-8的格式, 所以在exec 运行的时候接受的cmd命令返回值回事乱码情况

$ npm install iconv-lite
const iconv = require('iconv-lite');
iconv.skipDecodeWarning = true; // 这个主要是它会警告 , 大体意思是转化编码失去精度啥的 , 对于我来说不需要, 不想看见控制台报那种一片黄色警告的就加上这句 , 不加也行
const childProcess = require('child_process');

childProcess.exec(`dir`,{ encoding: 'binary' },(err, stdout, stderr)=>{
    if(err){
      // console.log('stdout1', iconv.decode(o, 'cp936'));
      console.log(iconv.decode(err, 'cp936'))
      return false;
    }else{
      let ress = iconv.decode(stdout, 'cp936');
  }
})

参考

  • https://cnodejs.org/topic/5a533acd99d207fa49f5cd11
  • https://www.cnblogs.com/sunjinggege/p/12606310.html

windows 下 npm 拉取 github 仓库问题

npm拉私有仓库报错:git@github.com: Permission denied (publickey) 怎么办呢?

npm 拉私有仓库报错无权限问题

$ npm i https://github.com/littlewrite/frameless-titlebar@v2.1.4-reatv18
npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead.
npm ERR! code 128
npm ERR! An unknown git error occurred
npm ERR! command git --no-replace-objects ls-remote ssh://git@github.com/littlewrite/frameless-titlebar@v2.1.4-reatv18.git
npm ERR! git@github.com: Permission denied (publickey).
npm ERR! fatal: Could not read from remote repository.
npm ERR!
npm ERR! Please make sure you have the correct access rights
npm ERR! and the repository exists.

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\wojia\AppData\Local\npm-cache\_logs\2022-07-27T03_44_39_166Z-debug-0.log

解决否

已解决

解决方案

  1. 在本地 生成 ssh key,然后添加到 github 配置。
  2. 添加到本地项目
  3. windows 下要启动一个啥 服务
  4. 可以开始 npm install 了, 带上https:// 后缀 .git ,如果要制定tag 再添加 #V1.0.0

参考

  • https://docs.github.com/cn/authentication/troubleshooting-ssh/error-permission-denied-publickey
  • https://www.zhihu.com/question/21402411
  • https://stackoverflow.com/questions/17846529/could-not-open-a-connection-to-your-authentication-agent
  • https://github.com/npm/npm/issues/14447

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

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

npm 入么,以及cnpm,rnpm

nodejs 包管理工具 npm,如何使用呢?cnpm,rnpm又是什么呢?

NPM

npm 是什么?

npm 为你和你的团队打开了连接整个 JavaScript 天才世界的一扇大门。它是世界上最大的软件注册表,每星期大约有 30 亿次的下载量,包含超过 600000 个 包(package) (即,代码模块)。来自各大洲的开源软件开发者使用 npm 互相分享和借鉴。包的结构使您能够轻松跟踪依赖项和版本。

相关网址

https://www.npmjs.com/

http://npm.taobao.org/mirrors

https://www.runoob.com/nodejs/nodejs-npm.html

下面是关于 npm 的快速介绍:

npm 由三个独立的部分组成:

  • 网站
  • 注册表(registry)
  • 命令行工具 (CLI)

网站 是开发者查找包(package)、设置参数以及管理 npm 使用体验的主要途径。

注册表 是一个巨大的数据库,保存了每个包(package)的信息。

CLI 通过命令行或终端运行。开发者通过 CLInpm 打交道。

使用

## 产看版本号
$ npm -v
2.3.0

## 在当前项目安装一个依赖性
$ npm install <Module Name>

## 全局安装
$ npm install npm -g

## 展示当前项目已安装依赖
$ npm list

## 查看某个包的具体信息
$ npm list grunt

## 展示全局所有包
$ npm list -g

## 卸载某个包
$ npm uninstall express

## 搜索相关 包
$ npm search express

## 自己初始化一个包
$ npm init 

包管理

npm是nodeJS包管理工具,经常会遇到下载依赖包非常缓慢,或者是下载不了的情况,所以需要更换包的源。
淘宝npm地址:http://npm.taobao.org/

临时

$ npm --registry https://registry.npm.taobao.org install express

永久生效

$ npm config set registry https://registry.npm.taobao.org

验证设置是否成功

$ npm config get registry

# OR
$ npm info express

通过cnpm 使用

$ npm install -g --registry=https://registry.npm.taobao.org
# 使用
$ cnpm install install express

cnpm

需求由来

由于node安装插件是从国外服务器下载,受网络影响大,速度慢且可能出现异常。所以如果npm的服务器在中国就好了,所以我们乐于分享的淘宝团队(阿里巴巴旗下业务阿里云)干了这事。来自官网:“这是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步。

也就是说我们可以使用阿里布置在国内的服务器来进行node安装。

2.使用方法
1.使用阿里定制的 cnpm 命令行工具代替默认的 npm,输入下面代码进行安装:

$ npm install -g cnpm --registry=https://registry.npm.taobao.org

2.检测cnpm版本,如果安装成功可以看到cnpm的基本信息。

cnpm -v

3.以后安装插件只需要使用cnpm intall即可

cnpm 用法和 npm 的用法是一样的。

rnpm

rnpm是什么?React Native基础之Linking Libraries链接库配置,Android/iOS RN原生功能依赖

“rnpm”是一个社区开源项目,该可以提供原生代码自动依赖链接的功能

React Native不是所有的应用都需要使用所有的原生代码开发的功能,并且需要包含所有特性的代码来支持,这样开发的应用包就会变得很大很臃肿。
但是我们还是希望能够简单快速的添加原生的特性功能。在这种情况下面我就有一种方案:把一下互不干扰的功能进行打包成静态库。

pnpm

正如我所提到的,在pnpm的作者Zoltan Kochan发表了“为什么要用pnpm?”之后,我才知道pnpm。

我不会介绍太多的细节(因为这篇文章已经发布很久了),但是你可以查看我的最初的帖子来寻找更多的内容,同时在Twitter上加入讨论。
但是,我想指出的是,pnpm运行起来非常的快,甚至超过了npm和yarn。

为什么这么快呢? 因为它采用了一种巧妙的方法,利用硬链接和符号链接来避免复制所有本地缓存源文件,这是yarn的最大的性能弱点之一。
使用链接并不容易,会带来一堆问题需要考虑。

正如Sebastian在Twitter上指出的那样,他最初是打算在yarn中使用符号链接的,但是由于其他一些原因放弃了它。

同时,正如在Github上拥有2000多个Star那样,pnpm能够为许多人所用。

此外,截至2017年3月,它继承了yarn的所有优点,包括离线模式和确定性安装。

参考

  • https://www.cnblogs.com/onew/p/11330439.html
  • https://juejin.im/post/6844903616109641736
  • https://www.jianshu.com/p/3d48785295d2
  • http://ian.wang/292.htm