diff --git a/packages/uni-h5/vite.config.ts b/packages/uni-h5/vite.config.ts index 5d2894c21df422b173895f62898b2d95297a1792..44aa27a1a256ece8b9e6dfe9703fa11bc4033fb7 100644 --- a/packages/uni-h5/vite.config.ts +++ b/packages/uni-h5/vite.config.ts @@ -115,9 +115,7 @@ export default defineConfig({ preserveEntrySignatures: 'strict', plugins: rollupPlugins, onwarn: (msg, warn) => { - if ( - !(msg.message || msg).includes('external module "vue" but never used') - ) { + if (!String(msg).includes('external module "vue" but never used')) { warn(msg) } }, diff --git a/packages/vite-plugin-uni/bin/uni.js b/packages/vite-plugin-uni/bin/uni.js new file mode 100755 index 0000000000000000000000000000000000000000..905cd0dacc5a8d25f2ee3434fd4ef71ada5085f7 --- /dev/null +++ b/packages/vite-plugin-uni/bin/uni.js @@ -0,0 +1,26 @@ +#!/usr/bin/env node +const debugIndex = process.argv.findIndex((arg) => /^(?:-d|--debug)$/.test(arg)) +const filterIndex = process.argv.findIndex((arg) => + /^(?:-f|--filter)$/.test(arg) +) +if (debugIndex > 0) { + let value = process.argv[debugIndex + 1] + if (!value || value.startsWith('-')) { + value = 'vite:*' + } else { + // support debugging multiple flags with comma-separated list + value = value + .split(',') + .map((v) => `vite:${v}`) + .join(',') + } + process.env.DEBUG = value + + if (filterIndex > 0) { + const filter = process.argv[filterIndex + 1] + if (filter && !filter.startsWith('-')) { + process.env.VITE_DEBUG_FILTER = filter + } + } +} +require('../dist/cli') diff --git a/packages/vite-plugin-uni/package.json b/packages/vite-plugin-uni/package.json index 5ed3032ff551815ed1a225c85f050304fa0ccb13..dd3f8095f76a441b8f55d2b47d75fb4a9533685d 100644 --- a/packages/vite-plugin-uni/package.json +++ b/packages/vite-plugin-uni/package.json @@ -2,6 +2,9 @@ "name": "@dcloudio/vite-plugin-uni", "version": "3.0.0", "description": "uni-app vite plugin", + "bin": { + "uni": "bin/uni.js" + }, "main": "dist/index.js", "types": "dist/index.d.ts", "files": [ @@ -23,6 +26,8 @@ "dependencies": { "@rollup/pluginutils": "^4.1.0", "autoprefixer": "^10.2.5", + "cac": "^6.7.3", + "chalk": "^4.1.1", "debug": "^4.3.1", "estree-walker": "^2.0.1", "fs-extra": "^9.0.1", diff --git a/packages/vite-plugin-uni/src/cli/index.ts b/packages/vite-plugin-uni/src/cli/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..f4732aa16e839bdced848ceb6b498f40ea991d95 --- /dev/null +++ b/packages/vite-plugin-uni/src/cli/index.ts @@ -0,0 +1,136 @@ +import { cac } from 'cac' +import chalk from 'chalk' +import { + LogLevel, + ServerOptions, + build, + createServer, + createLogger, + BuildOptions, +} from 'vite' + +import { initEnv, PLATFORMS } from './utils' + +const cli = cac('uni') + +export interface CliOptions { + '--'?: string[] + + platform?: string + p?: string + ssr?: boolean + + debug?: boolean | string + d?: boolean | string + filter?: string + f?: string + logLevel?: LogLevel + l?: LogLevel + clearScreen?: boolean +} + +function cleanOptions(options: CliOptions) { + const ret = { ...options } + delete ret['--'] + + delete ret.platform + delete ret.p + delete ret.ssr + + delete ret.debug + delete ret.d + delete ret.filter + delete ret.f + delete ret.logLevel + delete ret.l + delete ret.clearScreen + return ret +} + +cli + .option('-p,--platform [platform]', '[string] ' + PLATFORMS.join(' | '), { + default: 'h5', + }) + .option('-ssr', '[boolean] server-side rendering', { + default: false, + }) + .option('-l, --logLevel ', `[string] silent | error | warn | all`) + .option('--clearScreen', `[boolean] allow/disable clear screen when logging`) + .option('-d, --debug [feat]', `[string | boolean] show debug logs`) + .option('-f, --filter ', `[string] filter debug logs`) + +cli + .command('') + .alias('dev') + .option('--host [host]', `[string] specify hostname`) + .option('--port ', `[number] specify port`) + .option('--https', `[boolean] use TLS + HTTP/2`) + .option('--open [path]', `[boolean | string] open browser on startup`) + .option('--cors', `[boolean] enable CORS`) + .option('--strictPort', `[boolean] exit if specified port is already in use`) + .option( + '--force', + `[boolean] force the optimizer to ignore the cache and re-bundle` + ) + .action(async (options: CliOptions) => { + initEnv(options) + try { + const server = await createServer({ + root: process.env.VITE_ROOT_DIR, + logLevel: options.logLevel, + clearScreen: options.clearScreen, + server: cleanOptions(options) as ServerOptions, + }) + await server.listen() + } catch (e) { + createLogger(options.logLevel).error( + chalk.red(`error when starting dev server:\n${e.stack}`) + ) + process.exit(1) + } + }) + +cli + .command('build') + .option('--outDir ', `[string] output directory (default: dist)`) + .option( + '--assetsInlineLimit ', + `[number] static asset base64 inline threshold in bytes (default: 4096)` + ) + .option( + '--sourcemap', + `[boolean] output source maps for build (default: false)` + ) + .option( + '--minify [minifier]', + `[boolean | "terser" | "esbuild"] enable/disable minification, ` + + `or specify minifier to use (default: terser)` + ) + .option('--manifest', `[boolean] emit build manifest json`) + .option('--ssrManifest', `[boolean] emit ssr manifest json`) + .option( + '--emptyOutDir', + `[boolean] force empty outDir when it's outside of root` + ) + .option('-m, --mode ', `[string] set env mode`) + .option('-w, --watch', `[boolean] rebuilds when modules have changed on disk`) + .action(async (options: CliOptions) => { + initEnv(options) + try { + await build({ + root: process.env.VITE_ROOT_DIR, + logLevel: options.logLevel, + clearScreen: options.clearScreen, + build: cleanOptions(options) as BuildOptions, + }) + } catch (e) { + createLogger(options.logLevel).error( + chalk.red(`error during build:\n${e.stack}`) + ) + process.exit(1) + } + }) + +cli.help() +cli.version(require('../../package.json').version) +cli.parse() diff --git a/packages/vite-plugin-uni/src/cli/utils.ts b/packages/vite-plugin-uni/src/cli/utils.ts new file mode 100644 index 0000000000000000000000000000000000000000..65f3514298c1031b12ebd6cd176b1401a3a57421 --- /dev/null +++ b/packages/vite-plugin-uni/src/cli/utils.ts @@ -0,0 +1,22 @@ +import path from 'path' +import { CliOptions } from '.' + +export const PLATFORMS = [ + 'app', + 'h5', + 'mp-alipay', + 'mp-baidu', + 'mp-qq', + 'mp-toutiao', + 'mp-weixin', + 'quickapp-webview-huawei', + 'quickapp-webview-union', +] + +export function initEnv(options: CliOptions) { + process.env.VITE_ROOT_DIR = process.env.UNI_INPUT_DIR || process.cwd() + process.env.UNI_INPUT_DIR = + process.env.UNI_INPUT_DIR || path.resolve(process.cwd(), 'src') + + process.env.UNI_PLATFORM = options.platform as UniApp.PLATFORM +} diff --git a/packages/vite-plugin-uni/src/configResolved/plugins/cssScoped.ts b/packages/vite-plugin-uni/src/configResolved/plugins/cssScoped.ts index e8285491ba9cc015fde42c5e46c016b91ac81d2c..998cbb70a1fa3c5308809e14d2f58def4ac56188 100644 --- a/packages/vite-plugin-uni/src/configResolved/plugins/cssScoped.ts +++ b/packages/vite-plugin-uni/src/configResolved/plugins/cssScoped.ts @@ -6,7 +6,7 @@ import { EXTNAME_VUE, parseVueRequest } from '@dcloudio/uni-cli-shared' import { UniPluginFilterOptions } from '.' -const debugScoped = debug('uni:scoped') +const debugScoped = debug('vite:uni:scoped') const SCOPED_RE = /]*scoped[^>]*>/i diff --git a/packages/vite-plugin-uni/src/configResolved/plugins/index.ts b/packages/vite-plugin-uni/src/configResolved/plugins/index.ts index f9ba07987090cf04b902775553b94778570953a7..dbbae0b5c8fd20e65af7c1b78a59e95b825344f2 100644 --- a/packages/vite-plugin-uni/src/configResolved/plugins/index.ts +++ b/packages/vite-plugin-uni/src/configResolved/plugins/index.ts @@ -19,7 +19,7 @@ import { uniCssScopedPlugin } from './cssScoped' import { uniRenderjsPlugin } from './renderjs' import { uniPreVuePlugin } from './preVue' -const debugPlugin = debug('uni:plugin') +const debugPlugin = debug('vite:uni:plugin') export interface UniPluginFilterOptions extends VitePluginUniResolvedOptions { include?: FilterPattern diff --git a/packages/vite-plugin-uni/src/configResolved/plugins/inject.ts b/packages/vite-plugin-uni/src/configResolved/plugins/inject.ts index 61d642bffb01ad3467ac6eaaa09f158394099bef..1959fc6cdd8c87cf16a9fd45d01e318da80681a8 100644 --- a/packages/vite-plugin-uni/src/configResolved/plugins/inject.ts +++ b/packages/vite-plugin-uni/src/configResolved/plugins/inject.ts @@ -51,8 +51,8 @@ export interface InjectOptions { | Function } -const debugInject = debug('uni:inject') -const debugInjectTry = debug('uni:inject-try') +const debugInject = debug('vite:uni:inject') +const debugInjectTry = debug('vite:uni:inject-try') export function uniInjectPlugin(options: InjectOptions): Plugin { if (!options) throw new Error('Missing options') diff --git a/packages/vite-plugin-uni/src/configResolved/plugins/pageVue.ts b/packages/vite-plugin-uni/src/configResolved/plugins/pageVue.ts index 3cee1edb4d7a5ca4cd7b447a7672759d06a9438e..093e8e4783081eda341124814ecdeef71e41afed 100644 --- a/packages/vite-plugin-uni/src/configResolved/plugins/pageVue.ts +++ b/packages/vite-plugin-uni/src/configResolved/plugins/pageVue.ts @@ -6,7 +6,7 @@ import { Plugin } from 'vite' import { parseVueRequest } from '@dcloudio/uni-cli-shared' import { VitePluginUniResolvedOptions } from '../..' -const debugPageVue = debug('uni:page-vue') +const debugPageVue = debug('vite:uni:page-vue') export function uniPageVuePlugin( options: VitePluginUniResolvedOptions diff --git a/packages/vite-plugin-uni/src/configResolved/plugins/pre.ts b/packages/vite-plugin-uni/src/configResolved/plugins/pre.ts index 6d9a4b8934c8a97bab5a786abb92d8aaea81ad8f..0c85a76958bc2bf23c8a6ff09cc8148aef2602c1 100644 --- a/packages/vite-plugin-uni/src/configResolved/plugins/pre.ts +++ b/packages/vite-plugin-uni/src/configResolved/plugins/pre.ts @@ -11,9 +11,9 @@ import { } from '@dcloudio/uni-cli-shared' import { UniPluginFilterOptions } from '.' -const debugPreJs = debug('uni:pre-js') -const debugPreHtml = debug('uni:pre-html') -const debugPreJsTry = debug('uni:pre-js-try') +const debugPreJs = debug('vite:uni:pre-js') +const debugPreHtml = debug('vite:uni:pre-html') +const debugPreJsTry = debug('vite:uni:pre-js-try') const PRE_JS_EXTNAME = ['.json', '.css'].concat(EXTNAME_VUE).concat(EXTNAME_JS) const PRE_HTML_EXTNAME = EXTNAME_VUE diff --git a/packages/vite-plugin-uni/src/configResolved/plugins/preCss.ts b/packages/vite-plugin-uni/src/configResolved/plugins/preCss.ts index fbfd770258e7276bee0d090a2721ee5557a39702..119b00ca93906ddfd5df5436d7415c3d0466f535 100644 --- a/packages/vite-plugin-uni/src/configResolved/plugins/preCss.ts +++ b/packages/vite-plugin-uni/src/configResolved/plugins/preCss.ts @@ -5,8 +5,8 @@ import { preJs } from '@dcloudio/uni-cli-shared' import { UniPluginFilterOptions } from '.' -const debugPre = debug('uni:pre-css') -const debugPreTry = debug('uni:pre-css-try') +const debugPre = debug('vite:uni:pre-css') +const debugPreTry = debug('vite:uni:pre-css-try') const cssLangs = `\\.(less|sass|scss|styl|stylus|postcss)($|\\?)` const cssLangRE = new RegExp(cssLangs) /** diff --git a/packages/vite-plugin-uni/src/configResolved/plugins/preVue.ts b/packages/vite-plugin-uni/src/configResolved/plugins/preVue.ts index 93a6a75e6de2329c968dddad57f452b13a4c3b4b..4855edf12de9ef3a01ec3fa13c1afeda42433e90 100644 --- a/packages/vite-plugin-uni/src/configResolved/plugins/preVue.ts +++ b/packages/vite-plugin-uni/src/configResolved/plugins/preVue.ts @@ -11,7 +11,7 @@ import { parse } from '@vue/compiler-dom' import { MagicString } from '@vue/compiler-sfc' import { EXTNAME_VUE, parseVueRequest } from '@dcloudio/uni-cli-shared' -const debugPreVue = debug('uni:pre-vue') +const debugPreVue = debug('vite:uni:pre-vue') const WXS_LANG_RE = /lang=["|'](renderjs|wxs)["|']/ diff --git a/packages/vite-plugin-uni/src/configResolved/plugins/renderjs.ts b/packages/vite-plugin-uni/src/configResolved/plugins/renderjs.ts index 5129f58318b591a56ac962ef255ff1f3b77b2760..73b11c581db869032d30d4941ff06485106837b1 100644 --- a/packages/vite-plugin-uni/src/configResolved/plugins/renderjs.ts +++ b/packages/vite-plugin-uni/src/configResolved/plugins/renderjs.ts @@ -4,7 +4,7 @@ import { rewriteDefault } from '@vue/compiler-sfc' import { parseVueRequest } from '@dcloudio/uni-cli-shared' -const debugRenderjs = debug('uni:renderjs') +const debugRenderjs = debug('vite:uni:renderjs') export function uniRenderjsPlugin(): Plugin { return { diff --git a/packages/vite-plugin-uni/src/configResolved/plugins/static.ts b/packages/vite-plugin-uni/src/configResolved/plugins/static.ts index ada5284e58f10c106f7ac5ab51df7739c23d494d..ddeccbe1be9e813405dfbb9b4b8e6943ff808368 100644 --- a/packages/vite-plugin-uni/src/configResolved/plugins/static.ts +++ b/packages/vite-plugin-uni/src/configResolved/plugins/static.ts @@ -5,7 +5,7 @@ import { cleanUrl } from '@dcloudio/uni-cli-shared' import { UniPluginFilterOptions } from '.' import { createPublicFileFilter } from '../../utils' -const debugStatic = debug('uni:static') +const debugStatic = debug('vite:uni:static') /** * 提供static等目录静态资源加载 * @param _options diff --git a/packages/vite-plugin-uni/src/configureServer/static.ts b/packages/vite-plugin-uni/src/configureServer/static.ts index 07a514ed6e1d074c037afc0c952fe710390c21a6..8b9221aad790d1006fb5828a27c4a455e3bc19e8 100644 --- a/packages/vite-plugin-uni/src/configureServer/static.ts +++ b/packages/vite-plugin-uni/src/configureServer/static.ts @@ -10,7 +10,7 @@ import { VitePluginUniResolvedOptions } from '..' import { uniStaticMiddleware } from './middlewares/static' import { createPublicFileFilter } from '../utils' -const debugStatic = debug('uni:static') +const debugStatic = debug('vite:uni:static') /** * devServer时提供static等目录的静态资源服务 * @param server diff --git a/packages/vite-plugin-uni/src/handleHotUpdate/index.ts b/packages/vite-plugin-uni/src/handleHotUpdate/index.ts index fa5b49fecd33092e1c41add49abbe1def8344463..9a0cb8b5310178fb03233a9961a5eb643f4b3e30 100644 --- a/packages/vite-plugin-uni/src/handleHotUpdate/index.ts +++ b/packages/vite-plugin-uni/src/handleHotUpdate/index.ts @@ -8,7 +8,7 @@ import { parseManifestJson, parsePagesJson } from '@dcloudio/uni-cli-shared' import { VitePluginUniResolvedOptions } from '..' import { initEasycomsOnce, initFeatures } from '../utils' -const debugHmr = debug('uni:hmr') +const debugHmr = debug('vite:uni:hmr') async function invalidate(file: string, moduleGraph: ModuleGraph) { const mods = await moduleGraph.getModulesByFile(slash(file)) diff --git a/packages/vite-plugin-uni/src/resolveId/index.ts b/packages/vite-plugin-uni/src/resolveId/index.ts index 142cda72464d5447ba7310956347a3c2f009a1b1..25e31f9837519eee537511483150cbdd31313290 100644 --- a/packages/vite-plugin-uni/src/resolveId/index.ts +++ b/packages/vite-plugin-uni/src/resolveId/index.ts @@ -4,7 +4,7 @@ import { Plugin } from 'vite' import { VitePluginUniResolvedOptions } from '..' import { BUILT_IN_MODULES } from '../utils' -const debugResolve = debug('uni:resolve') +const debugResolve = debug('vite:uni:resolve') export function createResolveId( _options: VitePluginUniResolvedOptions diff --git a/packages/vite-plugin-uni/src/utils/easycom.ts b/packages/vite-plugin-uni/src/utils/easycom.ts index f6c415a55bfa705597c9e0e7c39dbfe586b09ab7..c51ab4861a493653c715b7303f504293c8092a9a 100644 --- a/packages/vite-plugin-uni/src/utils/easycom.ts +++ b/packages/vite-plugin-uni/src/utils/easycom.ts @@ -22,7 +22,7 @@ interface EasycomCustom { [key: string]: string } -export const debugEasycom = debug('uni:easycom') +export const debugEasycom = debug('vite:uni:easycom') const easycoms: EasycomMatcher[] = [] diff --git a/scripts/build.js b/scripts/build.js index ab347792fb005aadf03618f237a4581f808cfb2e..8c80c87a6daf8ede9ac63de1e28bd9bebe41647d 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -64,6 +64,9 @@ async function build(target) { env: Object.assign({ FORMAT: 'es' }, process.env), } ) + if (target === 'size-check') { + return + } return await execa( 'vite', ['build', '--config', path.resolve(pkgDir, 'vite.config.ts')], diff --git a/yarn.lock b/yarn.lock index c500c1a9ada2d0f85ba1fcb9c1ebde34eeed3dc4..7dbd158440f22308beccc98b83ce5657ce68768a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1676,6 +1676,11 @@ bytes-iec@^3.1.1: resolved "https://registry.yarnpkg.com/bytes-iec/-/bytes-iec-3.1.1.tgz#94cd36bf95c2c22a82002c247df8772d1d591083" integrity sha512-fey6+4jDK7TFtFg/klGSvNKJctyU7n2aQdnM+CO0ruLPbqqMOM8Tio0Pc+deqUeVKX1tL5DQep1zQ7+37aTAsA== +cac@^6.7.3: + version "6.7.3" + resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.3.tgz#10410b8611677990cc2e3c8b576d471c1d71b768" + integrity sha512-ECVqVZh74qgSuZG9YOt2OJPI3wGcf+EwwuF/XIOYqZBD0KZYLtgPWqFPxmDPQ6joxI1nOlvVgRV6VT53Ooyocg== + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"