From c2f7afedcb11d6b76b0c5872533acb5b63479e2f Mon Sep 17 00:00:00 2001 From: yutent Date: Wed, 28 Sep 2022 18:56:47 +0800 Subject: [PATCH] update --- index.js | 30 ++++++ lib/index.js | 295 ++++++++++++++++++++++++++------------------------- 2 files changed, 178 insertions(+), 147 deletions(-) create mode 100755 index.js diff --git a/index.js b/index.js new file mode 100755 index 0000000..da48320 --- /dev/null +++ b/index.js @@ -0,0 +1,30 @@ +#!/bin/env node + +/** + * {} + * @author yutent + * @date 2022/09/28 15:12:45 + */ + +import { join } from 'path' +import { createServer } from './lib/index.js' + +const WORK_SPACE = process.env.INIT_CWD + +let args = process.argv.slice(2) + +switch (args[0]) { + case 'dev': + import(join(WORK_SPACE, 'vue.live.js')) + .then(function (conf) { + // console.log(conf) + createServer(WORK_SPACE, conf.default) + }) + .catch(err => { + console.log('Import Error:', err) + }) + break + + case 'build': + break +} diff --git a/lib/index.js b/lib/index.js index 8f62b3a..bb2dbfc 100644 --- a/lib/index.js +++ b/lib/index.js @@ -8,7 +8,7 @@ import http from 'http' import fs from 'iofs' import { join, resolve } from 'path' import { parse } from 'url' -import conf from './live.config.js.js' +// import conf from './live.config.js' import { compileScss, parseJs, compileVue } from './compile-vue.js' @@ -16,184 +16,185 @@ import MIME_TYPES from './mime-tpyes.js' import { COMMON_HEADERS } from './constants.js' const decode = decodeURIComponent -const root = resolve('./src/') /* ------------------------------- */ -let pagesDir = resolve(conf.pages) -let pages = fs.ls(pagesDir).map(it => { - let tmp = it.slice(pagesDir.length + 1) + '.html' - return `
  • ${tmp}
  • ` -}) +export function createServer(root = '', conf = {}) { + let pagesDir = resolve(conf.pages) + let pages = fs.ls(pagesDir).map(it => { + let tmp = it.slice(pagesDir.length + 1) + '.html' + return `
  • ${tmp}
  • ` + }) -let currentPage = '' + let currentPage = '' -http - .createServer(function (req, res) { - let pathname = parse(req.url.slice(1)).pathname || 'index.html' + http + .createServer(function (req, res) { + let pathname = parse(req.url.slice(1)).pathname || 'index.html' - // console.log(req.url, pathname, parse(req.url.slice(1))) - let isIndex = pathname === 'index.html' + // console.log(req.url, pathname, parse(req.url.slice(1))) + let isIndex = pathname === 'index.html' - for (let k in COMMON_HEADERS) { - res.setHeader(k, COMMON_HEADERS[k]) - } + for (let k in COMMON_HEADERS) { + res.setHeader(k, COMMON_HEADERS[k]) + } - let tmp = pathname.split('.') - let ext = tmp.pop() - let page = tmp.join('.') + let tmp = pathname.split('.') + let ext = tmp.pop() + let page = tmp.join('.') - if (isIndex) { - res.setHeader('content-type', MIME_TYPES.html) - res.writeHead(200, 'OK') - res.end('') - } else { - res.setHeader('accept-ranges', 'bytes') + if (isIndex) { + res.setHeader('content-type', MIME_TYPES.html) + res.writeHead(200, 'OK') + res.end('') + } else { + res.setHeader('accept-ranges', 'bytes') - let code = '' + let code = '' - switch (ext) { - case 'html': - { - let entry = fs.cat(join(pagesDir, page, 'main.js')).toString() - let fixedStyle = '\n\n' + switch (ext) { + case 'html': + { + let entry = fs.cat(join(pagesDir, page, 'main.js')).toString() + let fixedStyle = '\n\n' - currentPage = page + currentPage = page - res.setHeader('content-type', MIME_TYPES.html) + res.setHeader('content-type', MIME_TYPES.html) - entry = entry - .replace(/import (.*?) from (["'])(.*?)\2/g, function (m, alias, q, name) { - if (name.startsWith('@/')) { - name = name.replace('@/', '/aseets/js/') - } - - if (!conf.imports[name]) { - if (name.startsWith('./')) { - name = name.replace('./', `/aseets/js/${currentPage}/`) - } else if (name.startsWith('/') && !name.startsWith('/aseets/js/')) { - name = name.replace(/^\//, '/aseets/js/') - } - - if (!name.endsWith('.js') && !name.endsWith('.vue')) { - name += '.js' - } - } - return `import ${alias} from '${name}'` - }) - .replace(/import (["'])(.*?)\1/g, function (m, q, name) { - if (name.endsWith('.css') || name.endsWith('.scss')) { - if (name.startsWith('@/')) { - name = name.replace('@/', '/aseets/css/') - } - let tmp = `style${Date.now()}` - fixedStyle += `document.adoptedStyleSheets.push(${tmp})\n` - - return `import ${tmp} from '${name}' assert { type: 'css' }` - } else { + entry = entry + .replace(/import (.*?) from (["'])(.*?)\2/g, function (m, alias, q, name) { if (name.startsWith('@/')) { name = name.replace('@/', '/aseets/js/') } - // console.log(name, conf.imports[name]) + if (!conf.imports[name]) { - if (!name.startsWith('/') && !name.startsWith('./')) { - name = '/' + name + if (name.startsWith('./')) { + name = name.replace('./', `/aseets/js/${currentPage}/`) + } else if (name.startsWith('/') && !name.startsWith('/aseets/js/')) { + name = name.replace(/^\//, '/aseets/js/') } if (!name.endsWith('.js') && !name.endsWith('.vue')) { name += '.js' } } - return `import '${name}'` - } - }) + return `import ${alias} from '${name}'` + }) + .replace(/import (["'])(.*?)\1/g, function (m, q, name) { + if (name.endsWith('.css') || name.endsWith('.scss')) { + if (name.startsWith('@/')) { + name = name.replace('@/', '/aseets/css/') + } + let tmp = `style${Date.now()}` + fixedStyle += `document.adoptedStyleSheets.push(${tmp})\n` - entry += fixedStyle + return `import ${tmp} from '${name}' assert { type: 'css' }` + } else { + if (name.startsWith('@/')) { + name = name.replace('@/', '/aseets/js/') + } + // console.log(name, conf.imports[name]) + if (!conf.imports[name]) { + if (!name.startsWith('/') && !name.startsWith('./')) { + name = '/' + name + } - code = fs.cat('./index.html').toString() - code = code - .replace( - '', - "" - ) - .replace('{{importmap}}', JSON.stringify({ imports: conf.imports })) - .replace( - '', - `` - ) - } + if (!name.endsWith('.js') && !name.endsWith('.vue')) { + name += '.js' + } + } + return `import '${name}'` + } + }) - break + entry += fixedStyle - case 'vue': - { - pathname = pathname.replace(/^aseets\/js\//, '') - let file - - if (pathname.startsWith(currentPage)) { - file = join(conf.pages, pathname) - } else { - file = join(root, pathname) + code = fs.cat('./index.html').toString() + code = code + .replace( + '', + "" + ) + .replace('{{importmap}}', JSON.stringify({ imports: conf.imports })) + .replace( + '', + `` + ) } - if (!fs.isfile(file)) { - file = file.replace(/\.vue$/, '/index.vue') + break + + case 'vue': + { + pathname = pathname.replace(/^aseets\/js\//, '') + let file + + if (pathname.startsWith(currentPage)) { + file = join(conf.pages, pathname) + } else { + file = join(root, pathname) + } + + if (!fs.isfile(file)) { + file = file.replace(/\.vue$/, '/index.vue') + } + + // console.log('>>>>', file) + code = compileVue(file) + + res.setHeader('content-type', MIME_TYPES.js) + } + break + + case 'scss': + case 'css': + { + let file = join(root, pathname.replace(/^aseets\/css\//, '')) + code = compileScss(file) + res.setHeader('content-type', MIME_TYPES.css) + } + break + + case 'js': + { + pathname = pathname.replace(/^aseets\/js\//, '') + let file + if (pathname.startsWith(currentPage)) { + file = join(conf.pages, pathname) + } else { + file = join(root, pathname) + } + if (fs.isfile(file)) { + code = fs.cat(file) + } else { + file = file.replace(/\.js$/, '/index.js') + code = fs.cat(file) + } + console.log(req.url, '>>>>', file) + code = parseJs(code + '') + res.setHeader('content-type', MIME_TYPES.js) } - // console.log('>>>>', file) - code = compileVue(file) + break - res.setHeader('content-type', MIME_TYPES.js) - } - break + default: + res.setHeader('content-type', MIME_TYPES[ext] || MIME_TYPES.other) + break + } - case 'scss': - case 'css': - { - let file = join(root, pathname.replace(/^aseets\/css\//, '')) - code = compileScss(file) - res.setHeader('content-type', MIME_TYPES.css) - } - break - - case 'js': - { - pathname = pathname.replace(/^aseets\/js\//, '') - let file - if (pathname.startsWith(currentPage)) { - file = join(conf.pages, pathname) - } else { - file = join(root, pathname) - } - if (fs.isfile(file)) { - code = fs.cat(file) - } else { - file = file.replace(/\.js$/, '/index.js') - code = fs.cat(file) - } - console.log(req.url, '>>>>', file) - code = parseJs(code + '') - res.setHeader('content-type', MIME_TYPES.js) - } - - break - - default: - res.setHeader('content-type', MIME_TYPES[ext] || MIME_TYPES.other) - break + res.setHeader('content-length', Buffer.byteLength(code)) + res.writeHead(200, 'OK') + res.end(code + '') } - - res.setHeader('content-length', Buffer.byteLength(code)) - res.writeHead(200, 'OK') - res.end(code + '') - } - }) - .listen(conf.port) - .on('error', err => { - console.log(`${conf.port}端口被占用~~~`) - conf.port++ - createServer() - }) - .on('listening', _ => { - // console.log('启动成功, 请访问', 'http://127.0.0.1:' + conf.port) - }) + }) + .listen(conf.port) + .on('error', err => { + console.log(`${conf.port}端口被占用~~~`) + conf.port++ + createServer() + }) + .on('listening', _ => { + console.log('启动成功, 请访问', 'http://127.0.0.1:' + conf.port) + }) +}