用 vue2 和 webpack 快速建构 NW.js 项目(1)

经过实践和学习,发现本篇文章部分内容已经过时,请看我的关于 Vue 和 NW.js 的 最新文章 和相关实践项目 vue-nw-seed 。


使用到的技能点

  • vue2

  • webpack

  • NW.js

  • Node.js

一、前言

先讲一下这个项目的由来。我司要新上一个产品,是面向教育领域的一个东西,要求快速开发又必须要兼容 XP ,所以就选 NW.js 来做桌面客户端。同时,前端的轮子方面,开始尝试在面向用户的业务上应用 vuejs 。
在这个过程中,也踩到了一些坑,也学到了一些新的小技巧,分享出来给大家参考一下。

有同学问,为啥不直接出一个完整项目?
我想等 webpack 升级完 webpack2 的时候再来一个懒人 seed 项目包吧

二、vue&webpack 项目搭建

首先用 vue-cli 快速的搭建一个 webpack 模板项目,省心又省事儿。
这部分不做过多介绍,很容易的。
方便新人理解和学习,给个参考链接 https://github.com/vuejs-temp...

三、NW.js 的建构

整个 nw 建构是基于 vue&webpack 这个前置步骤的项目的。
好了,我们开始。

1、先用 npm 安装 NW.js

1) 能顺利翻墙

NW.js 开发者们提供了 nwjs/npm-installer
如果您的网速较好,翻墙顺利的话,可以直接

npm install nw --nwjs_build_type=sdk --save

2) 网络不太好

当然我的网络情况就不是很好,233333
这时候可以先下载好 nw 的 sdk 包到本地,墙外地址:https://dl.nwjs.io/v0.20.1/nwjs-sdk-v0.20.1-win-x64.zip (截至目前现在最新的sdk版本是 0.20.1 ,系统环境是 win10 x64)当然,我作为一个老司机,也有不可推卸的责任,我把我这个包也发到了百度云上了:链接: http://pan.baidu.com/s/1i52ZO8l 密码: 3tt2
做了点微小的贡献,谢谢大家。

我已经尝试过 file:// 那个方法不能用了,换server模式吧

切换命令行目录到当前sdk包所在位置

C:\Users\anchengjian\Downloads> mkdir 0.20.1
C:\Users\anchengjian\Downloads> cp nwjs-sdk-v0.20.1-win-x64.zip ./0.20.1

再开启 server 服务,如果有python直接

C:\Users\anchengjian\Downloads> python -m SimpleHTTPServer 9999

或者换个姿势

C:\Users\anchengjian\Downloads> npm install http-server -g
C:\Users\anchengjian\Downloads> http-server -p 9999

服务开好就可以继续下一步了,切换目录到项目代码的目录下。

先创建一个 .npmrc 文件,内容如下:

nwjs_build_type=sdk
NWJS_URLBASE=http://localhost:9999/

再然后直接 npm 安装 nw

E:\code\vue-webpack-nw> npm i nw --save

这时,如无其他问题,已经装好了。

2、这时候开始增补nw相关的建构

下文直接以文件名为小标题

1) package.json

{"name": "vue-webpack-nw","version": "1.0.0","description": "vue-webpack-nw","author": "anchengjian <anchengjian@gmail.com>","private": true,"scripts": {"dev": "node build/dev-server.js","build": "node build/build.js","lint": "eslint --ext .js,.vue src"},"dependencies": {// ...},"devDependencies": {// ...},"engines": {"node": ">= 7.0.0","npm": ">= 4.0.0"},// 以下为 nw 的配置新加内容"main": "./index.html","window": {"title": "nw-vue-webpack2","toolbar": true,"frame": true,"width": 1200,"height": 800,"min_width": 800,"min_height": 500},"webkit": {"plugin": true},"node-remote": "http://localhost:8080"
}

2) build/webpack.base.conf.js

增加基础配置

module.exports = {// ...// 以下为新加内容target: 'node-webkit'
}

3) build/dev-nw.js

新建一个名为 dev-nw.js 的文件
内容如下,直接copy吧。
原理我就不讲了,大致实现的功能是:
先用 Node.js 修改当前项目 index.html 内容为打包出来的 index.html,然后再用 nw 打开当前项目目录,当关闭或者报错的时候再还原 index.html ,当前,你直接 kill 进程,这个还原就会出问题。自己看着改吧,233333

const path = require('path')
const url = require('url')
const fs = require('fs')
const http = require('http')
const exec = require('child_process').exec
const rootPath = path.resolve(__dirname, '../')
const nwPath = require('nw').findpath()// 修改index.html文件中的css和js的地址
const indexHtmlPath = path.resolve(__dirname, '../index.html')
const indexHtmlContent = fs.readFileSync(indexHtmlPath, 'utf-8').toString()// 退出时恢复原样子
process.on('exit', exitHandle)
process.on('uncaughtException', exitHandle)function exitHandle(e) {fs.writeFileSync(indexHtmlPath, indexHtmlContent, 'utf-8')console.log('233333,bye~~~')
}// get uri
var config = require('../config')
if (!process.env.NODE_ENV) process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV)
var port = process.env.PORT || config.dev.port
var uri = `http://localhost:${port}/`// start lauch NW.js
requestGet(uri, htmlText => {htmlText = htmlText.replace('src="/', `src="${uri}`).replace('href="/', `href="${uri}`)fs.writeFileSync(indexHtmlPath, htmlText, 'utf-8')let runNwDev = exec(`${nwPath} ./`, { cwd: rootPath }, (err, stdout, stderr) => {if (err) process.exit(0)})runNwDev.stdout.on('data', (data) => console.log(data))
})function requestGet(path, callback) {console.log('start with request: ', path)const options = Object.assign({ method: 'GET' }, url.parse(path))const req = http.request(options, res => {let body = []res.on('data', chunk => body.push(chunk))res.on('end', () => callback(Buffer.concat(body).toString()))})req.on('error', e => console.log('problem with request: ' + e.message))req.write('')req.end()
}

4) build/dev-server.js

在其最末尾修改一下,不需要打开浏览器,而是需要其代码驱动打开nw.exe

  // when env is testing, don't need open itif (process.env.NODE_ENV !== 'testing') {// opn(uri)// modify by anchengjian// 这儿不需要打开浏览器,只用打开 nw 就行require('./dev-nw')}

5) build/dev-client.js

这个时候直接在执行 npm run dev 正常的话是可以用 nw.exe 打开当前项目代码,但接着就可以看到有一个报错

GET chrome-extension://hbdgiajgpfdfalonjhdcdmbcmillcjed/__webpack_hmr net::ERR_FILE_NOT_FOUND

原因也就是webpack请求的时候根据当前页面地址来的,没想到还有 nw 这么个环境
处理方法也简单,更改 webpack-hot-middleware 的配置,让其每次发请求的时候用__webpack_public_path__ 或者全局变量。
同时请注意path=__webpack_hmr

hotClient这一行代码为这样子

var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true&dynamicPublicPath=true&path=__webpack_hmr')

这样配置的文档来源: webpack-hot-middleware

6) config/index.js

同时需要更改开发者模式下 assetsPublicPath 的配置,不然__webpack_public_path__依然为/

module.exports = {// ...dev: {env: require('./dev.env'),port: 8080,assetsSubDirectory: 'static',assetsPublicPath: 'http://localhost:8080/',proxyTable: {},// CSS Sourcemaps off by default because relative paths are "buggy"// with this option, according to the CSS-Loader README// (https://github.com/webpack/css-loader#sourcemaps)// In our experience, they generally work as expected,// just be aware of this issue when enabling this option.cssSourceMap: false}
}

至此,一个完整的开发建构就出来,后面慢慢更新产品模式的打包建构。

原文持续更新: https://github.com/anchengjian/anchengjian.github.io/blob/master/posts/2017/vuejs-webpack-nwjs.md

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396804.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql -- 索引的使用

普通索引&#xff1a;用于提升查询速度唯一索引&#xff1a;用于提升查询速度&#xff0c;还要求字段值不得重复主键索引&#xff1a;唯一性且不为空的索引全文索引&#xff1a;用于大量文本搜索中建立的索引虽然索引有好处&#xff0c;但是凡是都有俩面性&#xff0c;提高效率…

surface pro 7 linux,微软 Surface Pro、Studio、Laptop 全线更新

今晨&#xff0c;微软在纽约的秋季新品发布会上&#xff0c;发布了 Surface Pro 6、Laptop 2 以及最顶级的 Studio 2 三款备受期待的 Surface 产品。至此&#xff0c;包括年初的 Surface Book 2 在内&#xff0c;完成了2018 年 Surface 产品线所有升级计划。当然这场规模不算大…

dremwere怎样让多个图片并列排放_PPT图片布局不好看?六步教你,看完就会。

我们平时很多场合需要演示讲解时&#xff0c;少不了使用PPT。尤其目前白领层人士&#xff0c;项目总结、产品介绍、调研报告…无时无刻不被PPT包围&#xff0c;又无时无刻不被PPT设计所困恼。诚然设计好看实用的PPT需要高质量素材资源和坚实的文字功底。但在处理美化PPT时&…

ThreadLocal 你到底是个什么鬼

2019独角兽企业重金招聘Python工程师标准>>> 很多文章都拿它跟同步机制作比较&#xff0c;我觉得这个思路对于理解这个东西完全没有作用。 ThreadLocal跟synchronize这类东西作比较&#xff0c;是很多文章的套路&#xff0c;我感觉这么比较&#xff0c;就跟比较重载…

SqlServer双机热备技术实践笔记

SqlServer双机热备&#xff0c;大体上可以通过发布订阅&#xff0c;日志传送&#xff0c;数据库镜像来实现。 1&#xff0c;发布--订阅 是最早最简单的方案&#xff0c;但需要注意发布的时候&#xff0c;发布进程必须对快照目录有访问权限&#xff0c;这个问题可以从“查看快照…

安徽大学计算机教学平台c语言作业,安徽大学计算机教学部练习题与答案1.pdf

一、计算机基础知识1.下列叙述中&#xff0c;不是电子计算机特点的是_D____。A.运算速度快 B.计算精度高 C.高度自动化 D.逻辑判断能力差2.现代电子计算机的本质工作原理是__D___。A.能进行算术运算 B.运算速度高 C.计算精度高 D.存储并自动执行程序3.微型计算机的型号主要是以…

grep 显示包含两个关键字_linux三剑客之-grep

一、grep简介1.介绍全局查找正则表达式并且打印结果行的命令。2.输入一个文件或者一个标准输入(stdin),或者是一个“-”连字符()。3.输出打印在屏幕上4.grep家族扩展命令egrep、fgrep二、 Grep命令的应用1.命令格式grep [选项] 模式 [文件…]例如&#xff1a;grep root /etc/pa…

Python装饰器的实现原理

Python中的装饰器是通过利用了函数特性的闭包实现的&#xff0c;所以在说装饰器之前&#xff0c;我们需要先了解函数特性&#xff0c;以及闭包是怎么利用了函数特性的。 1.函数特性 Python中的函数特性总的来说有四点: 1.函数作为变量传递 def add(x):return x 1a add 2.函数…

c语言注释说明被计算机编译系统忽略,C语言程序设计(陈艳 2019-2020-2)-中国大学mooc-题库零氪...

第1章 C语言概述第1讲 C语言概述随堂测验1、程序 #include void main() { printf("Hello, world!\n"); } 经过编译运行会在显示器上输出 Hello, world&#xff01; 如果希望输出&#xff1a;Nice to meet you. 则应使用Nice to meet you.替换( )。A、voidB、mainC、p…

React文档(五)组件和props

组件可以让你将UI分割成独立的&#xff0c;可复用的模块&#xff0c;然后考虑将每个模块彼此隔离。从概念上理解&#xff0c;组件就像js中的函数。他们接受随意的输入&#xff08;被称为props&#xff09;然后返回React元素来描述屏幕上应该出现什么。 函数式和类式组件 定义一…

Windows 应用容器化

背景 在这个时间点&#xff0c;我们可能已经对 Linux 容器使用已经达到熟练掌握的程度&#xff0c;因为 Docker 与 Kubernetes 都是最早为 Linux 平台设计。当我们从容器这项技术中体会到种种收益&#xff0c;对于我们的 windows 的应用是否也能利用容器技术简化我们的开发运维…

python安装函数库pip网址_批量安装python库函数---pip

android Sqlite小记 1.android.database.sqlite.SQLiteException: near "": syntax error (code 1): 语法错误,如果你的报了这个错误 ... win8 VB6打开提示MSCOMCTL&period;ocx未注册 从xp上复制相应的文件到win8相应的位置,如果是不可以,win8中反注册此控件,再注…

关于OC中的block自己的一些理解(二)

一、block延伸&#xff1a;页面间反向传值 1&#xff09;first页面的代码 - (void)viewDidLoad {[super viewDidLoad];[self setupBtn];self.view.backgroundColor [UIColor whiteColor];} - (void)setupBtn {UIButton * btn [[UIButton alloc]init];[btn addTarget:self act…

C语言多项式乘法模拟,急!!!!c语言:求n次多项式的加法和乘法

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼if(s->data.coef!0.0){s->data.expnp->data.expn;r->nexts;rs;}pp->next;qq->next;break;case 1:s->data.coefq->data.coef;s->data.expnq->data.expn;r->nexts;rs;qq->next;break;}//switch}…

opengl 安装_如何使得支持 OpenGL 的 Flatpak 应用和游戏在专有 Nvidia 图形驱动下工作 | Linux 中国...

一些支持 OpenGL 并打包为 Flatpak 的应用和游戏无法使用专有 Nvidia 驱动启动。本文将介绍如何在不安装开源驱动(Nouveau)的情况下启动这些 Flatpak 应用或游戏。-- Logix这有个例子。我在我的 Ubuntu 18.04 桌面上使用专有的 Nvidia 驱动程序 (nvidia-driver-390)&#xff0c…

laravel -admin 禁止某一行删除

$grid->actions(function (Grid\Displayers\Actions $actions) {if ($actions->getKey() 1) {$actions->disableDelete();} });转载于:https://www.cnblogs.com/vinzen/p/9675823.html

thinkphp-where-数组条件-普通查询

语法Db::table(表名)->where(条件)->select();示例$map[name] thinkphp; $map[status] 1;// 把查询条件传入查询方法 Db::table(think_user)->where($map)->select();对应原始sqlSELECT * FROM think_user WHERE namethinkphp AND status1转载于:https://blog.51…

RequireJS入门(一)

RequireJS由James Burke创建&#xff0c;他也是AMD规范的创始人。 RequireJS会让你以不同于往常的方式去写JavaScript。你将不再使用script标签在HTML中引入JS文件&#xff0c;以及不用通过script标签顺序去管理依赖关系。 当然也不会有阻塞&#xff08;blocking&#xff09;的…

Oracle数据库中游标的游标的使用

本人不喜欢说概念啥的&#xff0c;就直接说明使用方法吧 案例1&#xff1a; 1 DECALRE2 --声明游标3 CURSOR C_USER(C_ID NUMBER) IS4 SELECT NAME FROM USER WHERE TYPEID C_ID;5 V_NAME C_USER%rowtype; --定义游标变量6 BEGIN7 OPEN C_USER(变量值); …

eclipse占用内存过大_idea被评最好用java开发工具,为什么用eclipse的人更多?

从事java开发一般都需要使用到一些开发工具&#xff0c;记得以前刚接触java的时候还用过MyEclipse。idea被评为最好用java开发工具&#xff0c;为什么用eclipse的人更多?下面一起来了解下吧&#xff01;IDEA毕竟不便宜啊&#xff0c;很多企业都买不起只能用Eclipse了&#xff…