Commit c419414f authored by 陈豪's avatar 陈豪

add rollup

parent 737ae9a6
WXT_ORIGIN = 'https://www.weixiaotong.com.cn/' WXT_ORIGIN = 'https://www.weixiaotong.com.cn/'
DOCUMENT_WIDTH = 1500 DOCUMENT_WIDTH = 1500
DOCUMENT_HEIGHT = 2668 DOCUMENT_HEIGHT = 2668
BROWER_PAGE_COUNT = 1 BROWER_PAGE_COUNT = 2
OPEN_MONITORING_SYSTEM = 1 OPEN_MONITORING_SYSTEM = 1
OPEN_GENERATE_LOG = 1
NODE_ENV = production
GROWTH_RESOURCE_PATH = ''
\ No newline at end of file
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
"version": "1.0.0", "version": "1.0.0",
"description": "", "description": "",
"scripts": { "scripts": {
"test": "node ./src/server/scripts/index" "build": "node ./scripts/build"
}, },
"author": "", "author": "",
"license": "ISC", "license": "ISC",
...@@ -11,8 +11,21 @@ ...@@ -11,8 +11,21 @@
"archiver": "^5.2.0", "archiver": "^5.2.0",
"chalk": "^4.1.0", "chalk": "^4.1.0",
"dotenv": "^8.2.0", "dotenv": "^8.2.0",
"execa": "^5.0.0",
"ora": "^5.3.0", "ora": "^5.3.0",
"os-utils": "0.0.14", "os-utils": "0.0.14",
"puppeteer": "2.1.1" "puppeteer": "2.1.1"
},
"devDependencies": {
"@babel/core": "^7.13.1",
"@rollup/plugin-alias": "^3.1.2",
"@rollup/plugin-babel": "^5.3.0",
"@rollup/plugin-commonjs": "^17.1.0",
"@rollup/plugin-json": "^4.1.0",
"@rollup/plugin-node-resolve": "^11.2.0",
"@rollup/plugin-replace": "^2.4.1",
"builtin-modules": "^3.2.0",
"rollup": "^2.39.0",
"rollup-plugin-terser": "^7.0.2"
} }
} }
require('dotenv').config()
import path from 'path'
import {terser} from 'rollup-plugin-terser'
import resolve from '@rollup/plugin-node-resolve'
import builtins from 'builtin-modules'
import json from '@rollup/plugin-json'
import commonjs from '@rollup/plugin-commonjs'
import alias from '@rollup/plugin-alias'
import replace from '@rollup/plugin-replace'
import babel from '@rollup/plugin-babel'
const protoFile = path.resolve(__dirname, 'src/server/index.js')
const projectRootDir = path.resolve(__dirname)
export default {
input: protoFile,
output: {
file: path.resolve(__dirname, 'dist/generate.js'),
format: 'cjs',
exports: 'default'
},
external: [...builtins, 'puppeteer', 'archiver'],
plugins: [
babel(),
replace({
values: {
__ROOTPATH__: process.env.PWD,
__PAGECOUNT__: process.env.BROWER_PAGE_COUNT,
__DOCUMENTWIDTH__: process.env.DOCUMENT_WIDTH,
__DOCUMENTHEIGHT__: process.env.DOCUMENT_HEIGHT,
__OPENSYSTEM__: process.env.OPEN_MONITORING_SYSTEM,
__GENERATELOG__: process.env.OPEN_GENERATE_LOG
}
}),
terser({
output: {
comments: true
}
}),
alias({
entries: [
{find: '@', replacement: path.resolve(projectRootDir, './src')},
{
find: '@server',
replacement: path.resolve(projectRootDir, './src/server')
}
]
}),
commonjs({
transformMixedEsModules: true,
dynamicRequireTargets: [
'node_modules/**/*readable-stream/lib/*.js',
'node_modules/*glob/sync.js',
'node_modules/*glob/glob.js'
]
}),
json(),
resolve()
]
}
const path = require('path')
const execa = require('execa')
const fs = require('fs')
const distFile = path.resolve(__dirname, '../dist')
const resourceFile = path.resolve(distFile, 'resource')
;(async () => {
try {
fs.statSync(distFile)
} catch (e) {
fs.mkdirSync(distFile)
}
await runExeca()
})()
async function runExeca() {
await execa('rollup', ['-c'], {
stdio: 'inherit'
})
}
const fs = require('fs') const fs = require('fs')
const path = require('path') const path = require('path')
const archiver = require('archiver') const archiver = require('archiver')
// const {objectUtils} = require('wxt-utils')
const pathResources = path.resolve(__dirname, '../resources') const nodePwd = '__ROOTPATH__'
const pathResources = path.resolve(nodePwd, './resources')
const resolve = p => path.resolve(pathResources, p) const resolve = p => path.resolve(pathResources, p)
module.exports = class Archiver { module.exports = class Archiver {
......
const path = require('path') const path = require('path')
const pathResources = path.resolve(__dirname, '../../resources')
const resolve = p => path.resolve(pathResources, p)
// conf // conf
const documentWidth = process.env.DOCUMENT_WIDTH - 0 const documentWidth = __DOCUMENTWIDTH__
const documentHeight = process.env.DOCUMENT_HEIGHT - 0 const documentHeight = __DOCUMENTHEIGHT__
module.exports = async function generation(page, url, pageIndex) { module.exports = async function generation(page, url, pageIndex) {
/** /**
...@@ -13,7 +10,7 @@ module.exports = async function generation(page, url, pageIndex) { ...@@ -13,7 +10,7 @@ module.exports = async function generation(page, url, pageIndex) {
*/ */
await page.setViewport({width: documentWidth, height: documentHeight}) await page.setViewport({width: documentWidth, height: documentHeight})
await page.goto(url, { await page.goto(url, {
timeout: 120000 // 请求超时时间 timeout: 40000 // 请求超时时间
// waitUntil: [] // waitUntil: []
}) })
......
const EventEmitter = require('events') const EventEmitter = require('events')
const puppeteer = require('puppeteer') const puppeteer = require('puppeteer')
const {infoLog, warnningLog} = require('../../utils/console') const {infoLog, warnningLog, log} = require('@/utils/console')
const {logWithSpinner, stopSpinner} = require('../../utils/org') const {logWithSpinner, stopSpinner, failSpinner} = require('@/utils/org')
const {generateImage} = require('./lib') const {generateImage} = require('./lib')
const Archiver = require('../compression/archiver') const Archiver = require('@server/compression/archiver')
const pageCount = process.env.BROWER_PAGE_COUNT - 0 const pageCount = __PAGECOUNT__
class Screen extends EventEmitter { class Screen extends EventEmitter {
constructor(urls) { constructor(urls) {
...@@ -32,31 +32,42 @@ class Screen extends EventEmitter { ...@@ -32,31 +32,42 @@ class Screen extends EventEmitter {
async initBrowser() { async initBrowser() {
// init(create) browser // init(create) browser
this.browser = await puppeteer.launch({ this.browser = await puppeteer
headless: true, // false将有浏览器界面启动 .launch({
// slowMo: 100, // 放慢浏览器执行速度,方便测试观察 // ignoreDefaultArgs: ['--mute-audio'],
args: [ headless: true, // false将有浏览器界面启动
// 启动 Chrome 的参数, // slowMo: 100, // 放慢浏览器执行速度,方便测试观察
// https://peter.sh/experiments/chromium-command-line-switches/ args: [
'--no-sandbox', // 启动 Chrome 的参数,
'--disable-setuid-sandbox', // 关闭沙箱 // https://peter.sh/experiments/chromium-command-line-switches/
'--disable-gpu', '--no-sandbox',
'--disable-dev-shm-usage', '--disable-setuid-sandbox', // 关闭沙箱
'--no-first-run', '--disable-gpu',
'--no-zygote' '--disable-dev-shm-usage',
// '--single-process' '--no-first-run',
], '--no-zygote'
// 是否将浏览器进程标准输出和标准错误输入到 process.stdout 和 process.stderr 中 // '--single-process'
dumpio: false ],
}) // 是否将浏览器进程标准输出和标准错误输入到 process.stdout 和 process.stderr 中
dumpio: false
})
.catch(e => {
failSpinner(e.toString())
process.exit(1)
})
} }
async initPages() { async initPages() {
// init(create) page // init(create) page
this.browserPages = [] this.browserPages = []
for (let i = 0; i < pageCount; i++) { try {
let browerPage = await this.browser.newPage() for (let i = 0; i < pageCount; i++) {
this.browserPages.push(browerPage) let browerPage = await this.browser.newPage()
this.browserPages.push(browerPage)
}
} catch (e) {
failSpinner(e.toString())
process.exit(1)
} }
} }
...@@ -93,15 +104,16 @@ class Screen extends EventEmitter { ...@@ -93,15 +104,16 @@ class Screen extends EventEmitter {
} }
// close // close
compression.archiveFinalize()
await this.closePages() await this.closePages()
await this.closeBrowser() await this.closeBrowser()
compression.archiveFinalize()
} }
readyGeneratePromise(starIndex) { readyGeneratePromise(starIndex) {
// 整理出 Promise list (多page generate) // 整理出 Promise list (多page generate)
let generatePromise = [] let generatePromise = []
let generateUrls = [] let generateUrls = []
log()
for (let i = 0; i < pageCount; i++) { for (let i = 0; i < pageCount; i++) {
let targetIndex = starIndex + i let targetIndex = starIndex + i
...@@ -113,13 +125,20 @@ class Screen extends EventEmitter { ...@@ -113,13 +125,20 @@ class Screen extends EventEmitter {
// url 存在为空的情况 跳过创建 generatePromise // url 存在为空的情况 跳过创建 generatePromise
if (!targetUrl) continue if (!targetUrl) continue
// this.emit('info', {
// code: 'INFO_GENERATE_URL',
// info: targetUrl
// })
generateUrls.push(targetUrl) // 标记记录 generateUrls.push(targetUrl) // 标记记录
// set generate promise - item // set generate promise - item
generatePromise.push(generateImage(targetPage, targetUrl)) generatePromise.push(generateImage(targetPage, targetUrl))
} }
this.emit('info', {code: 'INFO_GENERATE_URLS', info: generateUrls}) this.emit('info', {
code: 'INFO_GENERATE_URLS',
info: generateUrls.join('\n')
})
return generatePromise return generatePromise
} }
} }
......
require('dotenv').config() const {successLog, warnningLog} = require('@/utils/console')
const event = require('@/utils/event')
const {successLog, warnningLog} = require('../../utils/console') const {urls} = require('@/test.response')
const event = require('../../utils/event')
const {urls} = require('../../test.response') const Screen = require('@server/generation/puppeteer')
async function intoGenerate() {
const Screen = require('../generation/puppeteer')
;(async function () {
let screen = new Screen(urls) let screen = new Screen(urls)
// add event // add event
event(screen) event(screen)
...@@ -23,9 +21,9 @@ const Screen = require('../generation/puppeteer') ...@@ -23,9 +21,9 @@ const Screen = require('../generation/puppeteer')
) )
} catch (e) { } catch (e) {
// error // error
warnningLog(`screen.startGenerate had error:${JSON.stringify(e)}`) warnningLog(`\nscreen.startGenerate had error:${JSON.stringify(e)}`)
process.exit(0) process.exit(0)
} }
})() }
// module.exports = generates intoGenerate()
const {warnningLog, log} = require('./console') const {infoLog, warnningLog, log} = require('./console')
const os = require('os-utils') const os = require('os-utils')
const isMonitoringSystem = process.env.OPEN_MONITORING_SYSTEM - 0 // 系统cpu 使用监控 const isMonitoringSystem = __OPENSYSTEM__ // 系统cpu 使用监控
const isGenerateLog = __GENERATELOG__ // 生成服务进度日志
module.exports = function eventLog(event) { module.exports = function eventLog(event) {
if (!event) { if (!event) {
warnningLog('❌ node.event(EventEmitter) object is null') warnningLog('❌ node.event(EventEmitter) object is null')
return return
} }
// 生成服务号过程中的日志信息
{
if (isGenerateLog) {
// 正常info - 进度,节点标记
event.on('info', ({code, info}) => {
switch (code) {
case 'INFO_GENERATE_URL':
case 'INFO_GENERATE_URLS':
infoLog(info)
break
default:
break
}
})
// 错误(警告⚠️)信息()
event.on('error', () => {})
}
}
if (isMonitoringSystem) { // 打印os资源使用情况(Usage/Free)
// 打印os资源使用情况(Usage/Free) {
event.on('os', () => { if (isMonitoringSystem) {
// cpu - 1s后 event.on('os', () => {
logCpuInfo() // cpu - 1s后
// memory logCpuInfo()
setTimeout(() => { // memory
logFreemem() setTimeout(() => {
}, 1000) logFreemem()
}) }, 1000)
})
}
} }
} }
logCpuInfo = () => { function logCpuInfo() {
os.cpuUsage(v => warnningLog('\nCPU Usage (%): ' + numberFix(v * 100))) os.cpuUsage(v => warnningLog('\nCPU Usage (%): ' + numberFix(v * 100)))
os.cpuFree(v => warnningLog('CPU Free(%): ' + numberFix(v * 100))) os.cpuFree(v => warnningLog('CPU Free(%): ' + numberFix(v * 100)))
} }
logFreemem = () => { function logFreemem() {
let freememCout = numberFix(os.freemem()) let freememCout = numberFix(os.freemem())
warnningLog(`Free memory :${freememCout}`) warnningLog(`Free memory :${freememCout}`)
} }
......
var os = require('os-utils') const path = require('path')
os.cpuUsage(function (v) { const pathResources = path.resolve(__dirname, '../')
console.log('CPU Usage (%): ' + v) const resolve = p => path.resolve(pathResources, p)
})
os.cpuFree(function (v) { console.log(pathResources)
console.log('CPU Free:' + v)
})
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment