希望打包成1个web服务,运行exe,启动 angular,供浏览器显示。

问题分析:

其实angular编译后,都是静态文件了。只需要打包express,让express可以以exe的形式运行就可以了。

pkg的坑很多,写下来。

1 打包配置

这部分最坑。官网说的也不太清楚,绕了很多弯路。

我的最终做法如下:

1 在ng工程下单独建1个文件夹 命名为pkg(随便)

2 在pkg里建立package.json:

{
"name": "frontend",
"bin": "server.js",
"dependencies": {
"express": "4.17.1"
},
"pkg": {
"assets": ["../dist/**/*"]
}
}

说明:

1 只需要打包express作为静态文件服务器。

用于伺服ng build 之后的dist文件夹即可,而不是把整个ng工程都打包。

因为ng是前端,只是在开发过程中用npm/node 进行包管理,而不是用node写的后端服务

——一开始没想清这个,也确实发现pkg的问题:无法正确打包normalize.css 库, 然后才发现,我其实根本不需要打包这个。

2 dist文件夹全部当做assets处理。

即默认的ng编译出的文件位置。ng已经对文件进行了编译(--aot)。

3 建立server.js

const express = require('express');
const app = express();
const path = require('path'); const path_dist = path.join(path.resolve(__dirname, '..'), 'dist')
app.use(express.static(path_dist)); app.get('/*', (req, res) => {
res.sendFile(path.join(path_dist, 'index.html'));
}); var server = app.listen(4000, function () {
var host = server.address().address
var port = server.address().port
console.log(`server start successfully on http://${host}:${port}`)
})

说明:

1 静态文件指向外层dist文件夹

2 express 路由 写成/*,  保证直接访问任意host:port/XX/YY 这样的url时,都能正确处理。

 express 只负责把任意路由都指向  index.html就够了,

ng居然后面能自动正确处理路由。

这一点还是很智能,很省心的。

2 用pkg打包

win+R cmd,  cd到包含server.js和package.json的路径下 执行

pkg server.js -t win-x64 --config package.json

坑点1:必须显式指定 --config ,否则只会孤零零打包server.js一个文件。

启动服务后,如果是简单hello world会正确,但是ng工程 浏览器会提示

cannot GET /

因为根没用package.json,所以dist根本就没打包进来

坑点2:打包时,会首先下载一个pkg专用的node 二进制文件, 40M左右,发布的打包exe就是基于这个的。不同平台,不同node版本不同。好像只支持node长期版,比如10 12这样的。

但是国内网不好,下载很慢,甚至总是中断。

尝试每天不同时段下载试试,反正不下载好这个,是根本无从打包的。

下载位置:

C:\Users\用户名\.pkg-cache

v2.6 文件夹 是 pkg@4.4.0 用的  比如给windos 和 node12用的 就是 fetched-v12.2.0-win-x64

2.5 是 之前的版本

一旦下载好后:可以保存起来,复制到别的机器上,避免再次下载。

—— 最终打包成功后exe的体积约等于 下载的40M二进制文件 + dist文件夹的体积。

------------------------后记-----------------------------

用pkg打包坑点太多。 搜索了不少文章,但是误导,含混居多。包括官方文档,也不是太清楚。所以我就不列出引用了。

但是最终打包出来还是很小巧可人的。

总是打包失败的时候,我一度想直接用py的flask+ cxfreeze打包算了。那样必然体积大些。

现在这样很好。又学会1招。

angular打包(三):pkg的更多相关文章

  1. Mac Angular打包报错xcode-select: error: tool 'xcodebuild' requires Xcode

    Mac Angular打包报错: Error: xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer ...

  2. Angular总结三:组件

    Angular 的应用就是一棵组件树,一个页面可以是一个组件,某一页面的一个区块也可以是一个组件.为了弄明白组件及组件树,我将原来做过的一个静态网站进行组件改造. 原项目地址 https://gith ...

  3. angular打包(一): electron

    路由问题: 打包成electron前,需要修改 index.html <base href="/"> 成 <base href="./"> ...

  4. 从零开始一个个人博客 by asp.net core and angular(三)

    这是第三篇了,第一篇只是介绍,第二篇介绍了api项目的运行和启动,如果api项目没什么问题了,调试都正常了,那基本上就没什么事了,由于这一篇是讲前端项目的,所以需要运行angular项目了,由于前端项 ...

  5. Angular(三)

    Angular开发者指南(三)数据绑定   数据绑定AngularJS应用程序中的数据绑定是模型和视图组件之间的数据的自动同步. AngularJS实现数据绑定的方式可以将模型视为应用程序中的单一来源 ...

  6. Angular基础(三) TypeScript

    一.模仿Reddit a) 运行ng new –ng4angular-reddit创建应用,从随书代码中复制样式文件,新建组件app-root,代码为: 界面可以看到了: b) 对于界面输入的数据,获 ...

  7. 从flask视角理解angular(三)ORM VS Service

    把获取模型数据的任务重构为一个单独的服务,它将提供英雄数据,并把服务在所有需要英雄数据的组件间共享. @Injectable() export class HeroService { getHeroe ...

  8. [AIR] NativeExtension在IOS下的开发实例 --- ANE文件的打包(三)

    来源:http://bbs.9ria.com/thread-102041-1-1.html 好了,前面的准备工作做的差不多了.此时我们应用有下面几个文件:extension.xml    CoolEx ...

  9. angular打包(二):nw.js

    1 npm build 把ng编译出dist 2 单独写一个package.json 放在dist文件夹里. { "name": "app", "ma ...

随机推荐

  1. INPUT和CONSTRUCT指令——范例报表查询,作用让用户输入数据,自动生成SQL的WHERE条件,带开窗查询

    INPUT指令 说明:1. 当程序执行到INPUT指令时,会将控制权交给用户,让用户输入数据.2. 用户输入完字段的数据,会将数据回传给程序中的变量接收.3. 只要执行到INPUT的指令,程序会将每个 ...

  2. feign发送get请求时用复杂类传参

    如题,网上都有做法,只有有些人说的不清楚.而我自己也遇到了其他坑这里记录一下 1.就是网上说的做法: 客户端:application.yml加上配置: feign: httpclient: enabl ...

  3. O062、NFS Volume Provider(Part I)

    参考https://www.cnblogs.com/CloudMan6/p/5683352.html   cinder-volume 支持多种 volume provider ,前面我们一直使用的是默 ...

  4. luogu P4428 [BJOI2018]二进制

    luogu 先考虑怎样的二进制串才会被3整除.可以发现如果二进制位第\(0,2,4...2n\)位如果为\(1\),那么在模3意义下为1,如果二进制位第\(1,3,5...2n+1\)位如果为\(1\ ...

  5. 客户端注册Cannot execute request on any known server解决

    在对eureka注册中心服务端添加安全验证后,新版本springcloud出现一个问题就是,在客户端注册到服务中心时报了一个错:Cannot execute request on any known ...

  6. 点击登录页面成功后,后端返回数据需要保存,在另外一个页面,发送ajax请求的时候需要登录返回数据的其中的一部分当做参数然后拿到新的数据

    对于这个怎么操作首先我们要在登录的ajax请求中把后端的数据保存到sessionstorage中,代码如下 登录ajax $.ajax({ type:'post', url:xxxxxxxxx, da ...

  7. http协议:http请求、http响应、间隔时间跳转页面、禁用浏览器缓存

    转自:https://blog.csdn.net/u013372487/article/details/46991623 http协议 1. http协议是建立在  tcp/ip协议基础上. 2. 我 ...

  8. Windows去除开始菜单图标背景

    1.开始菜单图标右键找到目标程序的存储目录. 2.删除目录下的目标程序名+.VisualElementsManifest.xml的文件. 3.开始菜单图标右键找到图标的存储目录,取消开始屏幕固定并删除 ...

  9. linux命令详解——sed

    sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法 sed命令行格式为:          se ...

  10. STM32输出比较模式

    搜索好久,各种文章良莠不齐,转载以下几篇 http://www.eeworld.com.cn/mcu/article_2016101130334.html(输出比较冻结模式) http://www.e ...