angular打包(三):pkg
希望打包成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的更多相关文章
- Mac Angular打包报错xcode-select: error: tool 'xcodebuild' requires Xcode
Mac Angular打包报错: Error: xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer ...
- Angular总结三:组件
Angular 的应用就是一棵组件树,一个页面可以是一个组件,某一页面的一个区块也可以是一个组件.为了弄明白组件及组件树,我将原来做过的一个静态网站进行组件改造. 原项目地址 https://gith ...
- angular打包(一): electron
路由问题: 打包成electron前,需要修改 index.html <base href="/"> 成 <base href="./"> ...
- 从零开始一个个人博客 by asp.net core and angular(三)
这是第三篇了,第一篇只是介绍,第二篇介绍了api项目的运行和启动,如果api项目没什么问题了,调试都正常了,那基本上就没什么事了,由于这一篇是讲前端项目的,所以需要运行angular项目了,由于前端项 ...
- Angular(三)
Angular开发者指南(三)数据绑定 数据绑定AngularJS应用程序中的数据绑定是模型和视图组件之间的数据的自动同步. AngularJS实现数据绑定的方式可以将模型视为应用程序中的单一来源 ...
- Angular基础(三) TypeScript
一.模仿Reddit a) 运行ng new –ng4angular-reddit创建应用,从随书代码中复制样式文件,新建组件app-root,代码为: 界面可以看到了: b) 对于界面输入的数据,获 ...
- 从flask视角理解angular(三)ORM VS Service
把获取模型数据的任务重构为一个单独的服务,它将提供英雄数据,并把服务在所有需要英雄数据的组件间共享. @Injectable() export class HeroService { getHeroe ...
- [AIR] NativeExtension在IOS下的开发实例 --- ANE文件的打包(三)
来源:http://bbs.9ria.com/thread-102041-1-1.html 好了,前面的准备工作做的差不多了.此时我们应用有下面几个文件:extension.xml CoolEx ...
- angular打包(二):nw.js
1 npm build 把ng编译出dist 2 单独写一个package.json 放在dist文件夹里. { "name": "app", "ma ...
随机推荐
- 从入门到自闭之Python--MySQL数据库的单表操作
单表查询:select * from 表 where 条件 group by 分组 having 过滤 order by 排序 limit n; 语法: select distinct 字段1,字段2 ...
- oracle修改TNSLSNR的端口
oracle 服务一启动 TNSLSNR.exe 会占用8080端口,这时,如果我们其他程序需要使用8080端口就会比较麻烦,所以需要改一下端口: 用dba账户登录 CMD>sqlplus sy ...
- Spring 容器中 Bean 的生命周期
Spring 容器中 Bean 的生命周期 1. init-method 和 destory-method 方法 Spring 初始化 bean 或销毁 bean 时,有时需要作一些处理工作,因此 s ...
- Scala学习七——包和引入
一.本章要点 包也可也可以像内部类那样嵌套 包路径不是绝对路径 包声明链x.y.z并不自动将中间包x和x.y变成可见 位于文件顶部不带花括号的包声明在整个文件范围内有效 包对象可以持有函数和变量 引入 ...
- java——包装类数据缓存 ==号详解
Java对部分经常使用的数据采用缓存技术,即第一次使用该数据则创建该数据对象并对其进行缓存, 当再次使用等值对象时直接从缓存中获取,从而提高了程序执行性能.(只对常用数据进行缓存) Java中只是对部 ...
- ASP.NET_正则表达式_匹配HTML中的一行或多行
一.匹配数字串/flash/([0-9]+).htm 二.匹配不含双引号的字符串<p class=\"w490\">([^\"]+)</p> 三. ...
- Unity鼠标移动到物体上显示信息
相信大家玩游戏的时候,鼠标移动到游戏装备上,都会显示装备的的具体信息,那么接下来就写代码把,废话不多说. 下面是 效果图 鼠标移动到装备位置显示的信息,鼠标移动不在装备区域后不现实信息,下面是代码 : ...
- Selenium 基本使用
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.c ...
- vue导航栏制作
1,在components新建commnn目录,然后再新建nav目录,在此目录下新建nav-bottom.vue文件和nav-item.vue文件 2,nav-bottom.vue中的内容: < ...
- javascript是否像php一样有isset和empty?
javascript是否像php一样有isset和empty? is set()在php中用于检测是否设置了变量木浴桶,函数返回布尔值true/false.在javascript中,您可以用替换它!( ...