增加热加载支持
parent
24e900ac04
commit
6de1901742
62
lib/dev.js
62
lib/dev.js
|
@ -4,6 +4,7 @@ import fs from 'iofs'
|
||||||
import { join, resolve, dirname } from 'path'
|
import { join, resolve, dirname } from 'path'
|
||||||
import { parse } from 'url'
|
import { parse } from 'url'
|
||||||
import socket from './ws.js'
|
import socket from './ws.js'
|
||||||
|
import chokidar from 'chokidar'
|
||||||
|
|
||||||
import { compileScss, parseJs, compileVue, parseHtml } from './compile-vue.js'
|
import { compileScss, parseJs, compileVue, parseHtml } from './compile-vue.js'
|
||||||
|
|
||||||
|
@ -18,19 +19,6 @@ export default async function createServer(root = '', conf = {}) {
|
||||||
const PORT = conf.devServer.port || 8080
|
const PORT = conf.devServer.port || 8080
|
||||||
const USE_HTTPS = conf.devServer.https
|
const USE_HTTPS = conf.devServer.https
|
||||||
const DOMAIN = conf.devServer.domain || 'localhost'
|
const DOMAIN = conf.devServer.domain || 'localhost'
|
||||||
const server = (USE_HTTPS ? https : http)
|
|
||||||
.createServer(SERVER_OPTIONS)
|
|
||||||
.listen(PORT)
|
|
||||||
|
|
||||||
let indexPage = Object.keys(conf.pages)
|
|
||||||
.map(it => {
|
|
||||||
let tmp = it + '.html'
|
|
||||||
return `<li><a href="/${tmp}">${tmp}</a></li>`
|
|
||||||
})
|
|
||||||
.join('')
|
|
||||||
|
|
||||||
let pagesDir = '',
|
|
||||||
currentPage = ''
|
|
||||||
|
|
||||||
if (USE_HTTPS) {
|
if (USE_HTTPS) {
|
||||||
Object.assign(SERVER_OPTIONS, conf.devServer.ssl)
|
Object.assign(SERVER_OPTIONS, conf.devServer.ssl)
|
||||||
|
@ -41,6 +29,23 @@ export default async function createServer(root = '', conf = {}) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const server = (USE_HTTPS ? https : http)
|
||||||
|
.createServer(SERVER_OPTIONS)
|
||||||
|
.listen(PORT)
|
||||||
|
|
||||||
|
const ws = socket(server)
|
||||||
|
|
||||||
|
let indexPage = Object.keys(conf.pages)
|
||||||
|
.map(it => {
|
||||||
|
let tmp = it + '.html'
|
||||||
|
return `<li><a href="/${tmp}">${tmp}</a></li>`
|
||||||
|
})
|
||||||
|
.join('')
|
||||||
|
|
||||||
|
let ready = false
|
||||||
|
let pagesDir = '',
|
||||||
|
currentPage = ''
|
||||||
|
|
||||||
server
|
server
|
||||||
.on('request', function (req, res) {
|
.on('request', function (req, res) {
|
||||||
let pathname = parse(req.url.slice(1)).pathname
|
let pathname = parse(req.url.slice(1)).pathname
|
||||||
|
@ -222,9 +227,34 @@ export default async function createServer(root = '', conf = {}) {
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
const ws = await socket(server)
|
chokidar
|
||||||
|
.watch(root)
|
||||||
|
.on('all', (act, file) => {
|
||||||
|
if (ready) {
|
||||||
|
if (act === 'add' || act === 'change') {
|
||||||
|
let ext = file.slice(file.lastIndexOf('.') + 1)
|
||||||
|
console.log(ext)
|
||||||
|
|
||||||
console.log(ws)
|
switch (ext) {
|
||||||
|
case 'js':
|
||||||
|
ws.send({ action: 'reload' })
|
||||||
|
break
|
||||||
|
|
||||||
ws.send('hello from vue-live')
|
case 'css':
|
||||||
|
case 'scss':
|
||||||
|
ws.send({ action: 'render' })
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.on('ready', () => {
|
||||||
|
ready = true
|
||||||
|
console.log('预处理完成,监听文件变化中,请勿关闭本窗口...')
|
||||||
|
})
|
||||||
|
|
||||||
|
// setInterval(() => {
|
||||||
|
|
||||||
|
// ws.send({action: Math.random() < 0.5 ? 'render' : 'reload',data:'hello from vue-live'})
|
||||||
|
// }, 2000);
|
||||||
}
|
}
|
||||||
|
|
35
lib/ws.js
35
lib/ws.js
|
@ -1,5 +1,5 @@
|
||||||
/**
|
/**
|
||||||
* {}
|
* 一个简单到极致的 WebSocket 类
|
||||||
* @author yutent<yutent.io@gmail.com>
|
* @author yutent<yutent.io@gmail.com>
|
||||||
* @date 2023/01/17 17:32:51
|
* @date 2023/01/17 17:32:51
|
||||||
*/
|
*/
|
||||||
|
@ -14,12 +14,33 @@ function defer() {
|
||||||
return o
|
return o
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function (server) {
|
class WebSocket {
|
||||||
var _ = defer()
|
#ws = null // ws实例
|
||||||
var conn = new WebSocketServer({ server, path: '/ws-vue-live' })
|
#queue = [] // 消息队列
|
||||||
|
|
||||||
conn.on('connection', client => {
|
constructor(server) {
|
||||||
_.resolve(client)
|
var conn = new WebSocketServer({ server, path: '/ws-vue-live' })
|
||||||
|
conn.on('connection', ws => {
|
||||||
|
this.#ws = ws
|
||||||
|
// ws.on('message', data => {
|
||||||
|
// console.log(data + '');
|
||||||
|
// })
|
||||||
|
while (this.#queue.length) {
|
||||||
|
let msg = this.#queue.shift()
|
||||||
|
this.send(msg)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
return _.promise
|
}
|
||||||
|
|
||||||
|
send(msg = {}) {
|
||||||
|
if (this.#ws) {
|
||||||
|
this.#ws.send(JSON.stringify(msg))
|
||||||
|
} else {
|
||||||
|
this.#queue.push(msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function (server) {
|
||||||
|
return new WebSocket(server)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue