最近研究前端如何构造桌面级应用,看了一下nw和ecectron。于是自己使用vue写了一个pc版本的qq音乐播放器。由于时间太紧,做的功能很有限。代码重复率很高。希望可以体谅。本片文章主要是介绍nw与electron这两个工具。前端的代码已经开源,感兴趣的同学可以自己下载下来,添加一些比较有趣的功能以及进行代码的优化
接口
// 分类歌单数据
export function getDiscList() {
let href = window.location.href
let url
if (href.includes('localhost') || href.includes('127.0.0.1')) {
url = '/api/getDiscList'
} else {
url = 'http://127.0.0.1:3000/api/getDiscList'
}
// 需要拼接的数据
const data = Object.assign({}, commonParams, {
platform: 'yqq',
hostUin: 0,
sin: 0,
ein: 29,
sortId: 5,
needNewCode: 0,
categoryId: 10000000,
rnd: Math.random(),
format: 'json'
})
return axios.get(url, {
params: data
})
}
缓存
import {
getDiscList
} from './recommend.js'
let getDiscListCache
let test
function fn() {
if (!getDiscListCache) {
test = '测试变量'
getDiscListCache = getDiscList() // 在此赋值 import 引入的时候 就向后端发送接口
}
}
fn()
export {
getDiscListCache,
test
}
使用
methods: {
getcateList() {
getDiscListCache.then(res => {
console.log(test);
console.log(res);
this.songList = res.data.data.list;
});
}
}
分为首页、歌手列表页、歌手详情页、排行榜。排行榜详情页以及播放器页面,排行榜与歌手页基本一致 不做赘述
image
image
image
image
image
数据主要是获取QQ音乐的接口,有得接口jsonp的方式 就可以获取到数据 有得接口需要使用Node做一下代理 来解决跨域
在开发阶段,我们可以使用vue中的dev模块中的proxyTable进行路径的重写和代理的转发
在build的时候 我们可以手动配置 访问路径 或者使用express做一下配置 类似于我们将代码 放入nginx服务器中那样
我们需要在node启动的服务器里面(也就是本地服务器中)解决跨域问题
使用nw的时候需要解决不能播放音频的问题
index.html以及静态资源的这些路径问题
项目的css部分可以优化 优化为less,sass 或者cssmodule这样
项目的组件可以抽离一下 目前排行榜详情页以及歌手详情页基本上的逻辑是一样的 可以进行抽使用组件化 也可以使用 slot
项目中 还可以新增很多功能 比如说播放mv 下载歌曲 以及添加我喜欢的音乐等
A 使用express 去访问打包完成之后的dist目录的静态资源 B 为了解决 当dist文件拖入nw打开 或者 直接打开dist目录的index.html 以及使用electron打包之后 的接口访问跨域问题
import path from 'path'
import express from 'express'
import axios from 'axios'
import {join} from 'path'
const app = express()
// 挂载静态路径
// A
app.use(express.static(join(__dirname, '../../dist')))
let router = express.Router()
// B
router.all('*', function (req, res, next) {
// res.header('Access-Control-Allow-Origin', '*')
res.header('Access-Control-Allow-Origin', '*')
res.header('Access-Control-Allow-Headers', 'Content-Type,Content-Length, Authorization, Accept,X-Requested-With')
res.header('Access-Control-Allow-Methods', 'PUT,POST,GET,DELETE,OPTIONS')
res.header('X-Powered-By', ' 3.2.1')
next()
})
// 做代理的分发和请求 分类歌单
router.get('/getDiscList', function (req, res) {
var url = 'https://c.y.qq.com/splcloud/fcgi-bin/fcg_get_diss_by_tag.fcg'
axios.get(url, {
headers: {
referer: 'https://c.y.qq.com/',
host: 'c.y.qq.com'
},
params: req.query
}).then((response) => {
console.log('接口响应成功')
res.json(response.data)
}).catch((e) => {
console.log(e)
})
})
router.get('/lyric', function (req, res) {
var url = 'https://c.y.qq.com/lyric/fcgi-bin/fcg_query_lyric_new.fcg'
axios.get(url, {
headers: {
referer: 'https://c.y.qq.com/',
host: 'c.y.qq.com'
},
params: req.query
}).then((response) => {
// 由于response 是一个jsonp格式的 所以我们要对这个 进行json转化
var result = response.data
var regExe = /^\w+\(({[^()]+})\)$/
var matchArr = result.match(regExe)
if (matchArr) {
res.json(JSON.parse(matchArr[1]))
}
}).catch((e) => {
console.log(e)
})
})
app.use('/api', router)
app.listen(3000, () => {
console.log('服务器已经启动,监听的端口号是3000')
})
官网需要访问外国网站 下载需要访问外国网站 (唉...... 在这里贴一下nw的官网首页和下载截图)
image
image
Github上nw.js有两万多Star和接近3000的Fork,说明它已经相当成熟。 并且在Github项目的最后面,显示Intel有赞助这个项目,看起来很牛的样子
nw.js就是使HTML, CSS, JavaScript写的原本在浏览器上运行的程序,也可以在桌面端运行。
image
效果图:
image
image
sudo npm install -g nw
打包工具 (简单介绍几种 )
windows下的打包流程 https://www.cnblogs.com/tinyphp/p/5052327.html mac/osx下的打包流程
https://blog.csdn.net/weichuang_1/article/details/48849335
https://blog.csdn.net/baidu_30907803/article/details/78795405
MP3编码属于专利编码,非开源授权的,所以在nw.js中默认不支持MP3的播放,需要手动启用才行。
需要从社区中下载对应版本的libffmpeg.dll文件 然后将原来的替换一下即可解决
社区地址: https://github.com/iteufel/nwjs-ffmpeg-prebuilt/releases
目标文件地址: /Users/baidu/Desktop/nwjs-sdk-v0.31.1-osx-x64/nwjs.app/Contents/Versions/67.0.3396.79
我把这个软件安装在了桌面上 这是目标地址 大家只要记住后面的就行,Versions后面的数字 代表的nw内嵌的谷歌版本(不一样也没事)
通过快捷键 option+command+i 打开内置谷歌的控制台。如果不能打开 或没反应 有可能是大家下载的版本 不是带开发工具的
nwjs——你值得拥有! 不得不提nw.js开发出的应用已经涵盖了许多领域:
官网地址 (不用访问外国网站 这一点很棒)
image
简介
官方示例
# 克隆示例项目的仓库
$ git clone https://github.com/electron/electron-quick-start
# 进入这个仓库
$ cd electron-quick-start
# 安装依赖并运行
$ npm install && npm start
项目截图
image
image
electron的安装与打包工具的安装
字段里的 项目名字,version,icon路径要改成自己的;
命令行配置 参考上面
qq音乐接口获取方式的相关文档
https://blog.csdn.net/xiayiye5/article/details/79487560 https://blog.csdn.net/hhzzcc_/article/details/79769386 https://segmentfault.com/a/1190000007685830
nw相关资料
electron的相关资料
electron打包:electron-packager及electron-builder两种方式实现(for Windows)
实现让div的高度也自适应的方式 和宽度始终成一个比例,能有几种实现方法?
克隆项目地址
git clone https://github.com/majunchang/QQ-music.git
安装依赖
npm i
cd nodeServer
npm i
启动Node代理 在nodeServer文件夹下
npm run dev
本地预览 (项目的根目录下)
npm run dev
本地electron预览
npm run electron_dev
打包编译
npm run build
npm run electron_build