2025/2/8第一次更新

This commit is contained in:
爱吃咸鱼小猫咪
2025-02-08 18:50:38 +08:00
commit d7af560866
26519 changed files with 5046029 additions and 0 deletions
+8
View File
@@ -0,0 +1,8 @@
import type { Plugin } from 'vite';
declare module '@vue/compiler-sfc' {
interface SFCDescriptor {
id: string;
}
}
export declare const APP_CSS_JS = "./app.css.js";
export declare function uniAppCssPlugin(): Plugin;
+113
View File
@@ -0,0 +1,113 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.uniAppCssPlugin = exports.APP_CSS_JS = void 0;
const fs_extra_1 = __importDefault(require("fs-extra"));
const uni_cli_shared_1 = require("@dcloudio/uni-cli-shared");
exports.APP_CSS_JS = './app.css.js';
function uniAppCssPlugin() {
const inputDir = process.env.UNI_INPUT_DIR;
const appVueFilename = (0, uni_cli_shared_1.resolveAppVue)(inputDir);
return {
name: 'uni:app-nvue-app-style',
// 提前到 @vite/plugin-vue 之前执行,因为在 nvue 编译时,仅 import 了 App.vue 的 styles,这样导致 descriptor
// 一直使用的是上一次的(plugin-vue 会在 transformMain 中生成新的 descriptor),故不再交由 plugin-vue 来 load
// 而是当前插件直接处理
enforce: 'pre',
resolveId(id) {
if (id === exports.APP_CSS_JS) {
return exports.APP_CSS_JS;
}
},
load(id) {
if (id === exports.APP_CSS_JS) {
return genAppStylesCode(appVueFilename, this);
}
const { filename, query } = (0, uni_cli_shared_1.parseVueRequest)(id);
if (query.vue && query.type === 'style' && appVueFilename === filename) {
const descriptor = createAppDescriptor(filename, this);
const block = descriptor.styles[query.index];
if (block) {
return {
code: block.content,
map: '',
};
}
}
},
};
}
exports.uniAppCssPlugin = uniAppCssPlugin;
const defaultAppStylesCode = `exports.styles = []`;
async function genAppStylesCode(filename, pluginContext) {
pluginContext.addWatchFile(filename);
const descriptor = createAppDescriptor(filename, pluginContext);
if (!descriptor.styles.length) {
return defaultAppStylesCode;
}
let stylesCode = ``;
const styleVars = [];
for (let i = 0; i < descriptor.styles.length; i++) {
const style = descriptor.styles[i];
const src = style.src || descriptor.filename;
const attrsQuery = attrsToQuery(style.attrs, 'css');
const srcQuery = style.src ? `&src=${descriptor.id}` : ``;
const query = `?vue&type=style&index=${i}${srcQuery}&inline`;
const styleRequest = src + query + attrsQuery;
stylesCode += `\nimport _style_${i} from ${JSON.stringify(styleRequest)}`;
styleVars.push(`_style_${i}`);
}
return `
${stylesCode}
exports.styles = [${styleVars.join(',')}]
`;
}
function readAppCode(filename) {
if (!fs_extra_1.default.existsSync(filename)) {
return ``;
}
const source = fs_extra_1.default.readFileSync(filename, 'utf8');
if (source.includes('#endif')) {
return (0, uni_cli_shared_1.preNVueJs)((0, uni_cli_shared_1.preNVueHtml)(source));
}
return source;
}
let appDescriptor;
function createAppDescriptor(filename, pluginContext) {
const source = readAppCode(filename);
const id = (0, uni_cli_shared_1.hash)(source);
if (!appDescriptor || appDescriptor.id !== id) {
const { descriptor, errors } = require('@vue/compiler-sfc').parse(source, {
filename,
});
descriptor.id = id;
if (errors.length) {
errors.forEach((error) => pluginContext.error((0, uni_cli_shared_1.createRollupError)('uni:app-nvue-app-style', filename, error)));
}
appDescriptor = descriptor;
}
return appDescriptor;
}
// these are built-in query parameters so should be ignored
// if the user happen to add them as attrs
const ignoreList = ['id', 'index', 'src', 'type', 'lang', 'module'];
function attrsToQuery(attrs, langFallback, forceLangFallback = false) {
let query = ``;
for (const name in attrs) {
const value = attrs[name];
if (!ignoreList.includes(name)) {
query += `&${encodeURIComponent(name)}${value ? `=${encodeURIComponent(value)}` : ``}`;
}
}
if (langFallback || attrs.lang) {
query +=
`lang` in attrs
? forceLangFallback
? `&lang.${langFallback}`
: `&lang.${attrs.lang}`
: `&lang.${langFallback}`;
}
return query;
}
+6
View File
@@ -0,0 +1,6 @@
import type { Plugin } from 'vite';
export declare function uniEsbuildPlugin({ appService, }: {
renderer?: 'native';
appService: boolean;
}): Plugin;
export declare function wrapperNVueAppStyles(code: string): string;
+165
View File
@@ -0,0 +1,165 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.wrapperNVueAppStyles = exports.uniEsbuildPlugin = void 0;
const path_1 = __importDefault(require("path"));
const fs_extra_1 = __importDefault(require("fs-extra"));
const debug_1 = __importDefault(require("debug"));
const uni_cli_shared_1 = require("@dcloudio/uni-cli-shared");
const utils_1 = require("../../utils");
const utils_2 = require("../utils");
const appCss_1 = require("./appCss");
const debugEsbuild = (0, debug_1.default)('uni:app-nvue-esbuild');
const emittedHashMap = new WeakMap();
function uniEsbuildPlugin({ appService, }) {
let resolvedConfig;
let buildOptions;
const nvueOutputDir = (0, utils_1.nvueOutDir)();
const outputDir = process.env.UNI_OUTPUT_DIR;
let isFirst = true;
return {
name: 'uni:app-nvue-esbuild',
enforce: 'post',
configResolved(config) {
buildOptions = {
format: 'iife',
target: 'es6',
minify: config.build.minify ? true : false,
banner: {
js: `"use weex:vue";
${uni_cli_shared_1.polyfillCode}`,
},
bundle: true,
write: false,
plugins: [esbuildGlobalPlugin((0, utils_2.esbuildGlobals)(appService))],
};
resolvedConfig = config;
emittedHashMap.set(resolvedConfig, new Map());
},
async writeBundle(_, bundle) {
const entryPoints = [];
const assets = [];
Object.keys(bundle).forEach((name) => {
const chunk = bundle[name];
if (chunk.type === 'chunk' &&
chunk.facadeModuleId &&
chunk.facadeModuleId.endsWith('.nvue')) {
entryPoints.push(name);
}
else if (chunk.type === 'asset') {
assets.push(name);
}
});
// 仅 nvueOutputDir 时 copy
if (!appService) {
assets.forEach((name) => {
fs_extra_1.default.copySync(path_1.default.resolve(nvueOutputDir, name), path_1.default.resolve(outputDir, name), { overwrite: false });
});
}
if (!entryPoints.length) {
return;
}
const emittedHash = emittedHashMap.get(resolvedConfig);
const changedFiles = [];
if (buildAppCss()) {
changedFiles.push(uni_cli_shared_1.APP_CONFIG_SERVICE);
}
debugEsbuild('start', entryPoints.length, entryPoints);
for (const filename of entryPoints) {
await buildNVuePage(filename, buildOptions).then((code) => {
const outputFileHash = (0, uni_cli_shared_1.hash)(code);
if (emittedHash.get(filename) !== outputFileHash) {
changedFiles.push(filename);
emittedHash.set(filename, outputFileHash);
return fs_extra_1.default.outputFile(path_1.default.resolve(outputDir, filename), code);
}
});
}
if (!isFirst && changedFiles.length) {
process.env[changedFiles.includes(uni_cli_shared_1.APP_CONFIG_SERVICE)
? 'UNI_APP_CHANGED_FILES'
: 'UNI_APP_CHANGED_PAGES'] = JSON.stringify(changedFiles);
}
debugEsbuild('end');
isFirst = false;
},
};
}
exports.uniEsbuildPlugin = uniEsbuildPlugin;
/**
* 将 nvue 全局 css 样式注入 app-config-service.js
* @returns
*/
function buildAppCss() {
const appCssJsFilename = path_1.default.join((0, utils_1.nvueOutDir)(), appCss_1.APP_CSS_JS);
if (!fs_extra_1.default.existsSync(appCssJsFilename)) {
return;
}
const appCssJsCode = fs_extra_1.default.readFileSync(appCssJsFilename, 'utf8');
const appCssJsFn = new Function('module',
// vite build.target为esnext时, 生成的代码没有export default
appCssJsCode.includes('export default')
? appCssJsCode.replace(`export default`, `module.exports=`)
: appCssJsCode.replace(`exports`, `module.exports`));
const module = { exports: { styles: [] } };
appCssJsFn(module);
const appCssJsonCode = JSON.stringify(module.exports.styles);
if (process.env.UNI_NVUE_APP_STYLES === appCssJsonCode) {
return;
}
process.env.UNI_NVUE_APP_STYLES = appCssJsonCode;
// 首次 build 时,可能还没生成 app-config-service 的文件,故仅写入环境变量
const appConfigServiceFilename = path_1.default.join(process.env.UNI_OUTPUT_DIR, uni_cli_shared_1.APP_CONFIG_SERVICE);
if (!fs_extra_1.default.existsSync(appConfigServiceFilename)) {
return;
}
const appConfigServiceCode = fs_extra_1.default.readFileSync(appConfigServiceFilename, 'utf8');
fs_extra_1.default.writeFileSync(appConfigServiceFilename, wrapperNVueAppStyles(appConfigServiceCode));
return true;
}
function buildNVuePage(filename, options) {
return (0, uni_cli_shared_1.transformWithEsbuild)(`import App from './${filename}'
const webview = plus.webview.currentWebview()
if(webview){
const __pageId = parseInt(webview.id)
const __pagePath = '${(0, uni_cli_shared_1.removeExt)(filename)}'
let __pageQuery = {}
try{ __pageQuery = JSON.parse(webview.__query__) }catch(e){}
App.mpType = 'page'
const app = Vue.createPageApp(App,{$store:getApp({allowDefault:true}).$store,__pageId,__pagePath,__pageQuery})
app.provide('__globalStyles', Vue.useCssStyles([...__uniConfig.styles, ...(App.styles||[])]))
app.mount('#root')
}`, path_1.default.join((0, utils_1.nvueOutDir)(), 'main.js'), options).then((res) => {
if (res.outputFiles) {
return res.outputFiles[0].text;
}
return '';
});
}
function esbuildGlobalPlugin(options) {
const keys = Object.keys(options);
return {
name: 'global',
setup(build) {
keys.forEach((key) => {
const namespace = key + '-ns';
build.onResolve({ filter: new RegExp('^' + key + '$') }, ({ path }) => {
return {
path,
namespace,
};
});
build.onLoad({ filter: /.*/, namespace }, () => ({
contents: `module.exports = ${options[key]}`,
loader: 'js',
}));
});
},
};
}
function wrapperNVueAppStyles(code) {
return code.replace(/__uniConfig.styles=(.*);\/\/styles/, `__uniConfig.styles=${process.env.UNI_NVUE_APP_STYLES || '[]'};//styles`);
}
exports.wrapperNVueAppStyles = wrapperNVueAppStyles;
+4
View File
@@ -0,0 +1,4 @@
export declare function uniMainJsPlugin({ renderer, appService, }: {
renderer?: 'native';
appService: boolean;
}): import("vite").Plugin<any>;
+44
View File
@@ -0,0 +1,44 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.uniMainJsPlugin = void 0;
const uni_cli_shared_1 = require("@dcloudio/uni-cli-shared");
const appCss_1 = require("./appCss");
function uniMainJsPlugin({ renderer, appService, }) {
return (0, uni_cli_shared_1.defineUniMainJsPlugin)((opts) => {
return {
name: 'uni:app-nvue-main-js',
enforce: 'pre',
transform(code, id) {
if (opts.filter(id)) {
if (renderer !== 'native') {
return {
code: `import './${uni_cli_shared_1.PAGES_JSON_JS}';import('${appCss_1.APP_CSS_JS}').then(()=>{})`,
map: { mappings: '' },
};
}
if (appService) {
code = code.includes('createSSRApp')
? createApp(code)
: createLegacyApp(code);
return {
code: `import './${uni_cli_shared_1.MANIFEST_JSON_JS}';\nimport './${uni_cli_shared_1.PAGES_JSON_JS}';\n` +
code,
map: { mappings: '' },
};
}
return {
code: `import './${uni_cli_shared_1.PAGES_JSON_JS}';`,
map: { mappings: '' },
};
}
},
};
});
}
exports.uniMainJsPlugin = uniMainJsPlugin;
function createApp(code) {
return `${code.replace('createSSRApp', 'createVueApp as createSSRApp')};const {app:__app__,Vuex:__Vuex__,Pinia:__Pinia__}=createApp();uni.Vuex=__Vuex__;uni.Pinia=__Pinia__;__app__._component.mpType='app';__app__._component.render=()=>{};__app__.mount('#app');`;
}
function createLegacyApp(code) {
return `function createApp(rootComponent,rootProps){rootComponent.mpTye='app';rootComponent.render=()=>{};const app=createVueApp(rootComponent,rootProps);const oldMount=app.mount;app.mount=(container)=>{const appVm=oldMount.call(app,container);return appVm;};return app;};${code.replace('createApp', 'createVueApp')}`;
}
+48
View File
@@ -0,0 +1,48 @@
import type { Plugin } from 'vite';
interface NVuePages {
[filename: string]: {
disableScroll?: boolean;
scrollIndicator?: 'none';
};
}
export declare const nvuePagesCache: Map<Readonly<Omit<import("vite").UserConfig, "plugins" | "css" | "assetsInclude" | "optimizeDeps" | "worker" | "build"> & {
configFile: string | undefined;
configFileDependencies: string[];
inlineConfig: import("vite").InlineConfig;
root: string;
base: string;
publicDir: string;
cacheDir: string;
command: "build" | "serve";
mode: string;
isWorker: boolean;
isProduction: boolean;
envDir: string;
env: Record<string, any>;
resolve: Required<import("vite").ResolveOptions> & {
alias: import("vite").Alias[];
};
plugins: readonly Plugin<any>[];
css: import("vite").ResolvedCSSOptions;
esbuild: false | import("vite").ESBuildOptions;
server: import("vite").ResolvedServerOptions;
build: import("vite").ResolvedBuildOptions;
preview: import("vite").ResolvedPreviewOptions;
ssr: import("vite").ResolvedSSROptions;
assetsInclude: (file: string) => boolean;
logger: import("vite").Logger;
createResolver: (options?: Partial<import("vite").InternalResolveOptions> | undefined) => import("vite").ResolveFn;
optimizeDeps: import("vite").DepOptimizationOptions;
worker: import("vite").ResolvedWorkerOptions;
appType: import("vite").AppType;
experimental: import("vite").ExperimentalOptions;
} & import("vite").PluginHookUtils>, NVuePages>;
export declare function parseNVuePageOptions(filename: string): {
disableScroll?: boolean | undefined;
scrollIndicator?: "none" | undefined;
};
export declare function uniPagesJsonPlugin({ renderer, appService, }: {
renderer?: 'native';
appService: boolean;
}): Plugin;
export {};
+66
View File
@@ -0,0 +1,66 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.uniPagesJsonPlugin = exports.parseNVuePageOptions = exports.nvuePagesCache = void 0;
const path_1 = __importDefault(require("path"));
const uni_cli_shared_1 = require("@dcloudio/uni-cli-shared");
exports.nvuePagesCache = new Map();
// 在 @vue/compiler-sfc@3.2.47 执行前重写 @vue/compiler-dom compile 方法
const nvuePages = {};
function parseNVuePageOptions(filename) {
return nvuePages[filename];
}
exports.parseNVuePageOptions = parseNVuePageOptions;
function uniPagesJsonPlugin({ renderer, appService, }) {
return (0, uni_cli_shared_1.defineUniPagesJsonPlugin)((opts) => {
return {
name: 'uni:app-nvue-pages-json',
enforce: 'pre',
configResolved(config) {
exports.nvuePagesCache.set(config, nvuePages);
},
transform(code, id) {
if (!opts.filter(id)) {
return;
}
this.addWatchFile(path_1.default.resolve(process.env.UNI_INPUT_DIR, 'pages.json'));
(0, uni_cli_shared_1.getLocaleFiles)(path_1.default.resolve(process.env.UNI_INPUT_DIR, 'locale')).forEach((filepath) => {
this.addWatchFile(filepath);
});
const pagesJson = (0, uni_cli_shared_1.normalizePagesJson)(code, process.env.UNI_PLATFORM);
Object.keys(nvuePages).forEach((name) => {
delete nvuePages[name];
});
pagesJson.pages.forEach((page) => {
if (page.style.isNVue) {
const filename = (0, uni_cli_shared_1.normalizePath)(path_1.default.resolve(process.env.UNI_INPUT_DIR, page.path + '.nvue'));
nvuePages[filename] = {
disableScroll: page.style.disableScroll,
scrollIndicator: page.style.scrollIndicator,
};
// fix: question/164673
// this.addWatchFile(filename)
}
});
if (renderer === 'native' && appService) {
this.emitFile({
fileName: uni_cli_shared_1.APP_CONFIG_SERVICE,
type: 'asset',
source: (0, uni_cli_shared_1.normalizeAppConfigService)(pagesJson, (0, uni_cli_shared_1.parseManifestJsonOnce)(process.env.UNI_INPUT_DIR)),
});
return {
code: '',
map: { mappings: '' },
};
}
return {
code: (0, uni_cli_shared_1.normalizeAppNVuePagesJson)(pagesJson),
map: { mappings: '' },
};
},
};
});
}
exports.uniPagesJsonPlugin = uniPagesJsonPlugin;
+2
View File
@@ -0,0 +1,2 @@
import type { Plugin } from 'vite';
export declare function uniRenderjsPlugin(): Plugin;
+20
View File
@@ -0,0 +1,20 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.uniRenderjsPlugin = void 0;
const uni_cli_shared_1 = require("@dcloudio/uni-cli-shared");
function uniRenderjsPlugin() {
return {
name: 'uni:app-nvue-renderjs',
async transform(code, id) {
const { type } = (0, uni_cli_shared_1.parseRenderjs)(id);
if (!type) {
return;
}
return {
code: `export default {}`,
map: { mappings: '' },
};
},
};
}
exports.uniRenderjsPlugin = uniRenderjsPlugin;