mirror of
https://github.com/zhw2590582/ArtPlayer.git
synced 2026-10-24 14:41:20 -08:00
feat: update changelog with Parcel to Vite refactor
feat: add danmuku plugin documentation and i18n setup guide - Created a new documentation file for the danmuku plugin with code examples. - Added a comprehensive guide for language settings (i18n) including default languages, importing languages, adding new languages, and modifying existing languages. - Included code snippets for initializing the Artplayer with different language settings. Add internationalization support for multiple languages in Artplayer - Introduced Arabic (ar), Czech (cs), Spanish (es), Persian (fa), French (fr), Indonesian (id), Polish (pl), Russian (ru), Turkish (tr), Vietnamese (vi), and Traditional Chinese (zh-tw) translations. - Created corresponding JavaScript and ES module files for each language containing translated strings for player controls and settings. - Added a new documentation file for language settings in the project. feat: add initial implementation of start option page with interactive code execution buttons feat: add danmuku plugin documentation and i18n setup guide - Created a new documentation file for the danmuku plugin, providing code examples for usage. - Added a comprehensive guide for language settings, including default languages, importing languages, adding new languages, and modifying existing languages. - Included code snippets for initializing the Artplayer with different language settings and importing language files. refactor: update danmuku worker implementation and remove unused i18n files - Changed the way the Danmuku class creates a Web Worker by using a worker loader instead of creating a blob. - Removed Arabic, Czech, Spanish, Persian, French, Indonesian, Polish, Russian, Turkish, Vietnamese, and Traditional Chinese i18n files as they are no longer needed. - Updated the Vite build configuration to disable banners for inline workers and added a plugin to remove worker banners from generated code. feat: add danmuku plugin and i18n setup documentation - Created a new documentation file for the danmuku plugin, providing code examples for usage. - Added a new documentation file for language settings (i18n), detailing how to set default languages, import languages, and add new languages. - Included code snippets for initializing the Artplayer with different language settings and examples for modifying existing languages. feat: add danmuku plugin and i18n setup documentation - Created a new documentation file for the danmuku plugin with code examples. - Added a new documentation file for language settings (i18n) including import instructions and examples for setting default and custom languages. - Updated the i18n documentation to include details on adding and modifying languages. feat: add danmuku plugin and i18n setup documentation - Created a new JavaScript file for the danmuku plugin documentation with multiple code execution buttons. - Added a new JavaScript file for i18n (internationalization) setup documentation, including instructions for language settings, importing languages, and modifying language options. - Included examples for setting default languages and adding new languages in the i18n documentation. Refactor code structure for improved readability and maintainability
This commit is contained in:
1 parent
ddb78cf850
commit
699bf09577
397 files changed
+99776
-8638
No files matched your search
+71
-120
@@ -1,152 +1,103 @@
|
||||
import fs from 'node:fs'
|
||||
import path from 'node:path'
|
||||
import process from 'node:process'
|
||||
import { Parcel } from '@parcel/core'
|
||||
import cpy from 'cpy'
|
||||
import prompts from 'prompts'
|
||||
import { getProjects } from './utils.js'
|
||||
import { build as viteBuild } from 'vite'
|
||||
import { getProjects, getViteBuildConfig, toPascalCase } from './utils.js'
|
||||
|
||||
const projects = getProjects()
|
||||
const compiledPath = path.resolve('docs/compiled')
|
||||
|
||||
function compressString(input) {
|
||||
return input
|
||||
.replace(/\s*(<[^>]+>)\s*/g, '$1')
|
||||
.replace(/(\r\n|\n|\r)/g, ' ')
|
||||
.replace(/\s+/g, ' ')
|
||||
.trim()
|
||||
}
|
||||
|
||||
async function build(name, targetName, clean = false) {
|
||||
const projectPackageJson = path.join(projects[name], 'package.json')
|
||||
const { version } = JSON.parse(fs.readFileSync(projectPackageJson, 'utf-8'))
|
||||
|
||||
process.chdir(projects[name])
|
||||
|
||||
const distDir = path.join(projects[name], 'dist')
|
||||
|
||||
if (clean && fs.existsSync(distDir)) {
|
||||
fs.rmSync(distDir, { recursive: true, force: true })
|
||||
console.log(`🗑️ Cleaned ${distDir}`)
|
||||
}
|
||||
|
||||
const targets = {
|
||||
main: {
|
||||
context: 'browser',
|
||||
distDir,
|
||||
sourceMap: false,
|
||||
outputFormat: 'global',
|
||||
isLibrary: true,
|
||||
engines: {
|
||||
browsers: 'last 1 Chrome version',
|
||||
},
|
||||
},
|
||||
legacy: {
|
||||
context: 'browser',
|
||||
distDir,
|
||||
sourceMap: false,
|
||||
outputFormat: 'global',
|
||||
isLibrary: true,
|
||||
engines: {
|
||||
browsers: 'IE 11',
|
||||
},
|
||||
},
|
||||
esm: {
|
||||
context: 'browser',
|
||||
distDir,
|
||||
sourceMap: false,
|
||||
outputFormat: 'esmodule',
|
||||
isLibrary: true,
|
||||
engines: {
|
||||
browsers: 'last 1 Chrome version',
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
const names = {
|
||||
main: `${name}.js`,
|
||||
legacy: `${name}.legacy.js`,
|
||||
esm: `${name}.mjs`,
|
||||
}
|
||||
|
||||
const entryFile = path.join(projects[name], 'src/index.js')
|
||||
|
||||
const bundler = new Parcel({
|
||||
entries: entryFile,
|
||||
defaultConfig: '@parcel/config-default',
|
||||
mode: 'production',
|
||||
targets: {
|
||||
[targetName]: targets[targetName],
|
||||
},
|
||||
env: {
|
||||
NODE_ENV: 'production',
|
||||
},
|
||||
})
|
||||
|
||||
const banner = `
|
||||
/*!
|
||||
function getBanner(name, version) {
|
||||
return `/*!
|
||||
* ${name}.js v${version}
|
||||
* Github: https://github.com/zhw2590582/ArtPlayer
|
||||
* (c) 2017-${new Date().getFullYear()} Harvey Zhao
|
||||
* Released under the MIT License.
|
||||
*/
|
||||
`
|
||||
*/`
|
||||
}
|
||||
|
||||
const { bundleGraph, buildTime } = await bundler.run()
|
||||
const bundles = bundleGraph.getBundles()
|
||||
const BUILD_FORMATS = {
|
||||
main: { format: 'umd', ext: '.js', target: 'es2020', minify: 'terser' },
|
||||
legacy: { format: 'umd', ext: '.legacy.js', target: 'es2015', minify: 'terser' },
|
||||
esm: { format: 'es', ext: '.mjs', target: 'es2020', minify: 'terser' },
|
||||
}
|
||||
|
||||
const filePath = path.join(distDir, 'index.js')
|
||||
const newFilePath = path.join(distDir, names[targetName])
|
||||
const code = fs.readFileSync(filePath, 'utf-8')
|
||||
async function build(name, targetName, clean = false) {
|
||||
const projectDir = projects[name]
|
||||
const { version } = JSON.parse(fs.readFileSync(path.join(projectDir, 'package.json'), 'utf-8'))
|
||||
const distDir = path.join(projectDir, 'dist')
|
||||
const entryFile = path.join(projectDir, 'src/index.js')
|
||||
|
||||
fs.writeFileSync(filePath, banner + compressString(code))
|
||||
fs.renameSync(filePath, newFilePath)
|
||||
const size = fs.statSync(newFilePath).size / 1024
|
||||
await cpy(newFilePath, compiledPath)
|
||||
if (clean && fs.existsSync(distDir)) {
|
||||
fs.rmSync(distDir, { recursive: true, force: true })
|
||||
}
|
||||
|
||||
console.log(
|
||||
`✨ Built@${targetName} ${name}@${version}`,
|
||||
`Bundles@${bundles.length}`,
|
||||
`Time@${buildTime}ms`,
|
||||
`Size@${size.toFixed(2)}kb`,
|
||||
)
|
||||
const startTime = Date.now()
|
||||
const { format, ext, target, minify } = BUILD_FORMATS[targetName]
|
||||
const fileName = `${name}${ext}`
|
||||
|
||||
const config = getViteBuildConfig({
|
||||
entry: entryFile,
|
||||
outDir: distDir,
|
||||
name: toPascalCase(name),
|
||||
format,
|
||||
fileName,
|
||||
minify,
|
||||
target,
|
||||
banner: getBanner(name, version),
|
||||
})
|
||||
|
||||
// Terser options for all builds (preserve banner comments starting with /*!)
|
||||
const isLegacy = targetName === 'legacy'
|
||||
config.build.terserOptions = {
|
||||
ecma: isLegacy ? 5 : 2020,
|
||||
compress: { ecma: isLegacy ? 5 : 2020, comparisons: false, inline: 2 },
|
||||
mangle: { safari10: true },
|
||||
format: {
|
||||
ecma: isLegacy ? 5 : 2020,
|
||||
comments: /^!/,
|
||||
ascii_only: true,
|
||||
max_line_len: false, // No line length limit
|
||||
},
|
||||
}
|
||||
|
||||
await viteBuild({ root: projectDir, ...config })
|
||||
|
||||
const outFile = path.join(distDir, fileName)
|
||||
const size = (fs.statSync(outFile).size / 1024).toFixed(2)
|
||||
await cpy(outFile, compiledPath)
|
||||
|
||||
console.log(`✨ Built@${targetName} ${name}@${version} Time@${Date.now() - startTime}ms Size@${size}kb`)
|
||||
}
|
||||
|
||||
async function buildProject(name) {
|
||||
await build(name, 'main', true)
|
||||
await build(name, 'legacy')
|
||||
await build(name, 'esm')
|
||||
}
|
||||
|
||||
async function runBuild() {
|
||||
if (process.argv.pop() === 'all') {
|
||||
const bundles = Object.keys(projects).map(name => async () => {
|
||||
await build(name, 'main', true)
|
||||
await build(name, 'legacy')
|
||||
await build(name, 'esm')
|
||||
})
|
||||
|
||||
await runPromisesInSeries(bundles)
|
||||
if (process.argv.includes('all')) {
|
||||
for (const name of Object.keys(projects)) {
|
||||
await buildProject(name)
|
||||
}
|
||||
console.log('✅ Finished building all packages!')
|
||||
}
|
||||
else {
|
||||
const response = await prompts({
|
||||
const { value } = await prompts({
|
||||
type: 'select',
|
||||
name: 'value',
|
||||
message: 'Which project do you want to build?',
|
||||
choices: Object.keys(projects).map(name => ({
|
||||
title: name,
|
||||
value: name,
|
||||
})),
|
||||
initial: 0,
|
||||
choices: Object.keys(projects).map(name => ({ title: name, value: name })),
|
||||
})
|
||||
|
||||
if (response.value) {
|
||||
await build(response.value, 'main', true)
|
||||
await build(response.value, 'legacy')
|
||||
await build(response.value, 'esm')
|
||||
}
|
||||
if (value)
|
||||
await buildProject(value)
|
||||
}
|
||||
}
|
||||
|
||||
function runPromisesInSeries(ps) {
|
||||
return ps.reduce((p, next) => p.then(next), Promise.resolve())
|
||||
}
|
||||
|
||||
runBuild().catch((error) => {
|
||||
console.error('❌ Build script encountered an error:', error)
|
||||
console.error('❌ Build failed:', error)
|
||||
process.exitCode = 1
|
||||
})
|
||||
Reference in new issue
Block a user