经过实践和学习,发现本篇文章部分内容已经过时,请看我的关于 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-templates/webpack

三、NW.js 的建构

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

1、先用 npm 安装 NW.js

1) 能顺利FQ

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

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模式吧 通过和作者沟通load local file is error!!! #54file:// 协议安装这个问题已经解决了。安装方式很简单

npm i nw --nwjs_urlbase=file://C:\\Users\\anchengjian\\Downloads --save 

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 it
if (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

用 vue2 和 webpack 快速建构 NW.js 项目的更多相关文章

  1. webpack快速入门——配置JS压缩,打包

    1 .首先在webpack.config.js中引入 const uglify = require('uglifyjs-webpack-plugin'); 2.然后在plugins配置里 plugin ...

  2. vue2.0+webpack+vuerouter+vuex+axios构建项目基础

    前言 本文讲解的是vue2.0+webpack+vuerouter+vuex+axios构建项目基础 步骤 1.全局安装webpack,命令 npm install webpack -g 注意,web ...

  3. webpack快速入门——实战技巧:watch的正确使用方法,webpack自动打包

    随着项目大了,后端与前端联调,我们不需要每一次都去打包,这样特别麻烦,我们希望的场景是,每次按保存键,webpack自动为我们打包,这个工具就是watch! 因为watch是webpack自带的插件, ...

  4. webpack快速入门——CSS进阶:自动处理CSS3前缀

    为了浏览器的兼容性,有时候我们必须加入-webkit,-ms,-o,-moz这些前缀.目的就是让我们写的页面在每个浏览器中都可以顺利运行. 1.安装 cnpm i postcss-loader aut ...

  5. webpack快速入门——如何安装webpack及注意事项

    1.window+R键,输入cmd打开命令行工具,输入 mkdir XXXX(XX:文件夹名): 2.cd XXX 进入刚刚创建好的文件夹里,输入cnpm install -g webpack (安装 ...

  6. webpack快速入门——webpack3.X 快速上手一个Demo

    1.进入根目录,建两个文件夹,分别为src和dist 1).src文件夹:用来存放我们编写的javascript代码,可以简单的理解为用JavaScript编写的模块. 2).dist文件夹:用来存放 ...

  7. webpack快速入门——配置文件:入口和出口,多入口、多出口配置

    1.在根目录新建一个webpack.config.js文件,然后开始配置: const path = require('path'); module.exports={ //入口文件的配置项 entr ...

  8. webpack快速入门——配置文件:服务和热更新

    1.在终端安装 cnpm i webpack-dev-server --save-dev 2.配置好后执行 webpack-dev-server,这时候会报错 出现错误,只需要在pagejson里配置 ...

  9. webpack快速入门——CSS文件打包

    1.在src下新建css文件,在css文件下新建index.css文件,输入以下代码 body{ background:pink; color:yellowgreen; } 2.css建立好后,需要引 ...

  10. webpack快速入门——插件配置:HTML文件的发布

    1.把dist中的index.html复制到src目录中,并去掉我们引入的js 2.在webpack.config.js中引入 const htmlPlugin = require('html-web ...

随机推荐

  1. JS解混淆

    JS解混淆 最近在整理之前和一些同伴的分享资料,发现时间已经过了好久,特此整理一些有价值的分享记录. JS混淆 学习js混淆可以逆向分析混淆和加密过程,实战可用于爬虫和渗透信息获取 本文档用于初步介绍 ...

  2. 抓包整理————tcp 三次握手性能优化[十]

    前言 tcp 三次握手性能优化. 正文 服务器三次握手流程示例: 下面就是3次握手的过程: 知道这个有什么用呢? 我举一个我使用到的例子哈. 比如有很多 tcp 连接到一台机器上机器上,那么tcp_m ...

  3. 重新点亮shell————awk函数[十五]

    前言 简单介绍一下awk函数. 正文 算术函数 字符串函数 自定义函数 例子: 结 awk就到这里了.

  4. sql 语句系列(计算一个季度的开始日期和结束日期)[八百章之第二十三章]

    前言 很多时候,我们进行数据库查询的时候,查询一个季度的财务报表的时候. 比如说查询2020年第一季度的单子,可能传入后台的就是20201,表示的就是20201第一季度,这时候我们要转换为日期. se ...

  5. docker 应用篇————具名挂载和匿名挂载[十三]

    前言 简单整理一下具名挂载和匿名挂载. 正文 来看一下匿名挂载. 这里-v指定了容器内部的路径,但是没有指定容器外部的路径,那么挂载到了什么地方. 用inspect 查看一下. 挂载到这个位置了. 然 ...

  6. vue3.0 中文文档(暂时)地址

    https://v3.cn.vuejs.org/ https://vue-docs-next-zh-cn.netlify.app/guide/installation.html#vue-devtool ...

  7. CF1933D Turtle Tenacity: Continual Mods

    思路: 此题其实很简单,不要被邪恶的出题人迷惑了双眼. 此题判断有解一共有两种情况. 通过题意可以知道将原数组排序后如果 \(b_{1} \ne b_{2}\),那么最后的结果一定 \(\ne 0\) ...

  8. 记一次WPF的DataGrid绑定数据

    之前一直在用winform,但是感觉界面不好看,然后就自己在网上学习WPF.一开始看到DataGrid的时候,还以为它是DataGridView,然后用winform的方法绑定数据发现不行,在不断的查 ...

  9. echarts使用与踩坑

    0.踩坑点 1.当图表不显示在页面(display:none)执行resize可能会导致图表样式混乱 1. 官网示例 import * as echarts from 'echarts'; // 基于 ...

  10. Llama3-8B到底能不能打?实测对比

    前几天Meta开源发布了新的Llama大语言模型:Llama-3系列,本次一共发布了两个版本:Llama-3-8B和Llama-3-70B,根据Meta发布的测评报告,Llama-3-8B的性能吊打之 ...