月度归档: 2020 年 7 月

  • 自制热敏打印机连接器始末(3)

    接上一篇,分清楚了两种模块的规范,那么怎么解决两种规范的不同呢,似乎可以通过配置babel来实现,于是我在babel.config.js中尝试了很多办法,都没有收效,归根结底是还没有搞清楚vue和electron之间是如何各自适用这些规范的。

    按照某种说法,最新的vue是遵循ES6,而electron或者说node模块是CommonJs,但是,在项目中,npm install进来的模块都放在node_modules中,怎么区分呢,如果不是babel.config.js来负责,那就应该是electron相关的,于是我找到了electronBuilder这个配置。

    在vue.config.js(如果没有则在项目根目录新建)中:

    module.exports = {
      configureWebpack: {
        devtool: "source-map"
      },
      pluginOptions: {
        electronBuilder: {
          // List native deps here if they don't work
          externals: ["escpos", "escpos-usb"]
          // If you are using Yarn Workspaces, you may have multiple node_modules folders
          // List them all here so that VCP Electron Builder can find them
        }
      }
      // chainWebpack: config => {
      //   config.module
      //     .rule("js")
      //     .test(/\.jsx?$/)
      //     .exclude.clear()
      //     .end()
      //     .include.add(function() {
      //       return ["./node_modules/escpos", "./node_modules/escpos-usb", "src"];
      //     })
      //     .end();
      // }
    };
    

    这个发现得益于https://medium.com/@nyorikakar/printing-with-vue-electron-and-node-f52a730e63e7这篇文章,而且我还在后面的评论中发现了https://github.com/song940/node-escpos/issues/297,最终靠这些信息搞清楚了逻辑。

    (1)对于用于node的模块,需要在vue.config.js的externals那里列出,这样,vue就不会让babel啥的那些loader去处理了。

    (2)负责和node打交道的代码要放在background.js中,这在前面第二个连接中可以看到,而且最关键的是在vue的代码因为是通过BrowserWindow加载的,在其初始化是webPreferences中的nodeIntegration这个属性需要配置为true,const { ipcRenderer } = window.require(“electron”);才能用。而且,这个true如果是放在.env中不能直接给process.env.ELECTRON_NODE_INTEGRATION=true,那样,调到的是字符串,不是布尔值,会出现下面的报错:

    Uncaught TypeError: window.require is not a function
        at Module../node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/App.vue?vue&type=script&lang=js& (App.vue:22)
        at __webpack_require__ (bootstrap:853)
        at fn (bootstrap:150)
        at Module../src/App.vue?vue&type=script&lang=js& (App.vue?c53a:1)
        at __webpack_require__ (bootstrap:853)
        at fn (bootstrap:150)
        at Module../src/App.vue (App.vue:1)
        at __webpack_require__ (bootstrap:853)
        at fn (bootstrap:150)
        at Module../src/main.js (HelloWorld.vue?adfd:1)
  • 自制热敏打印机连接器始末(2)从跨平台方案开始

    接上一篇,选择vue+electron之后,那就按electron-vue这个来。虽然能跑起来,但是代码上传到git以后,收到很多高危报警,https://github.com/futuremeng/electron-vue-escpos-bridge

    尝试升级一下,结果发现因为版本已经差太多,需要花很多时间修,遂放弃。通过检索,发现有一个新的方案,https://nklayman.github.io/vue-cli-plugin-electron-builder/

    于是,开启新的https://github.com/futuremeng/vue-electron-builder-escpos-printer-bridge

    先用vue cli4创建一个新的项目,再vue add electron-builder。尝试运行yarn electron:serve 的时候提示Vue Devtools下载失败,需要翻墙跑成功一遍才行。

    接下来分析打印机如何连接,通过检索发现escpos这个协议,据说是大部分打印机都支持的。那么是否可以用escpos直接驱动打印机呢,网上有树莓派的示范。

    在寻找合适的escpos驱动的时候,发现了各种版本的,除了java、python,还有php和node,我决定选择node版的https://www.npmjs.com/package/escpos

    但是,当然当我尝试引入到项目的时候,悲剧发生了。

    ERROR Failed to compile with 1 errors 16:30:59

    error in ./node_modules/escpos/statuses.js

    Module parse failed: Unexpected token (7:7)
    You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
    |
    | class DeviceStatus {

    byte = ”;
    | bits = [];
    | bitsAsc = [];

    @ ./node_modules/escpos/index.js 12:17-38
    @ ./node_modules/cache-loader/dist/cjs.js??ref–12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref–0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/App.vue?vue&type=script&lang=js&
    @ ./src/App.vue?vue&type=script&lang=js&
    @ ./src/App.vue
    @ ./src/main.js
    @ multi (webpack)-dev-server/client?http://192.168.3.139:8080&sockPath=/sockjs-node (webpack)/hot/dev-server.js ./src/main.js

    见到是loader的问题,我就尝试配置babel-loader script-loader file-loader。都没有解决问题,实际上,我也不是很了解这些loader到底是干什么的。

    在这个过程中,了解到CommonJS和ES6这些区别,还有,在网页版的vue项目和electron中还涉及到运行环境的问题,网页中没有办法直接调用node接口。

  • 自制热敏打印机连接器始末(1)不想花钱,还想跨平台

    前情回顾:做了一个网站,需要在网页上打印二维码,将热敏打印机连到电脑上,在网页上直接用print打印出来的二维码完全无法识别,应该是分辨率的问题,因为屏幕的分辨率和打印机的分辨率差太多。所以寻找解决方案,找到了c-lodop.com这个网站提供的中间件,需要付费,而且只有win版。

    需求分析:现在重构网站,计划做成saas模式,在打印模块上,需要尽量摆脱第三方的束缚,所以构思如何自己实现。

    网页到打印机,这中间是网页-浏览器-操作系统-usb-打印机,这样一个路径。经过确认,网页直接连打印机是不显示的,有一个比较接近的办法是通过chrome的app方案,但通用性不高,放弃,那就只剩下跟lodop一样的模式了,要么把整个网站构建成桌面程序,要么通过中间件来连打印机,网页再通过http或者socket驱动中间件。

    当然,选择一个中间件是比较合适的,整个后台构建成桌面程序,没有必要,维护起来也太笨重。

    接下来,就是选择跨平台的桌面程序方案来做这个中间件了。需要实现几个部分,一是http或者socket,二是打印机连接,中间的打印机连接管理。

    当然,首选相对比较熟悉的vue+electron的方案。

  • 老家的房子

    老家的房子,没有多少人住了,房子没有人住,就坏的快了。

    我家的屋脊瓦片滑脱,需要重新盖压,找不到人。

    我小姑家的房梁塌陷,找不到包工队承接修复的活儿。

    虽然做了确权,但是不知道什么时候就要拆了,所以没有办法投入改造成度假的拥有现代居住条件的房子,村子里的环境也不是一家两家能改善的。

    前几年有说法是乡村沦陷,这是真的,沦陷不在于乡村的沉沦,而在于完整产权的丧失。