用 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.pswp.cn/news/396804.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396804.shtml
英文地址,請注明出處:http://en.pswp.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…