提交 51427a3f 编写于 作者: fxy060608's avatar fxy060608

wip(uts): compiler

上级 8c465081
......@@ -137,8 +137,8 @@ const props = {
},
title: {
type: String,
default: ''
}
default: '',
},
}
type EventName =
......
......@@ -2,7 +2,6 @@ import {
defineUniMainJsPlugin,
MANIFEST_JSON_JS,
PAGES_JSON_JS,
UNI_MODULES_EXPORTS,
} from '@dcloudio/uni-cli-shared'
import { APP_CSS_JS } from './appCss'
......@@ -21,7 +20,7 @@ export function uniMainJsPlugin({
if (opts.filter(id)) {
if (renderer !== 'native') {
return {
code: `import './${PAGES_JSON_JS}';import '${UNI_MODULES_EXPORTS}';import('${APP_CSS_JS}').then(()=>{})`,
code: `import './${PAGES_JSON_JS}';import('${APP_CSS_JS}').then(()=>{})`,
map: { mappings: '' },
}
}
......@@ -31,13 +30,13 @@ export function uniMainJsPlugin({
: createLegacyApp(code)
return {
code:
`import './${MANIFEST_JSON_JS}';\nimport './${PAGES_JSON_JS}';\nimport '${UNI_MODULES_EXPORTS}';\n` +
`import './${MANIFEST_JSON_JS}';\nimport './${PAGES_JSON_JS}';\n` +
code,
map: { mappings: '' },
}
}
return {
code: `import './${PAGES_JSON_JS}';import '${UNI_MODULES_EXPORTS}';`,
code: `import './${PAGES_JSON_JS}';`,
map: { mappings: '' },
}
}
......
import {
defineUniMainJsPlugin,
PAGES_JSON_JS,
UNI_MODULES_EXPORTS,
} from '@dcloudio/uni-cli-shared'
import { defineUniMainJsPlugin, PAGES_JSON_JS } from '@dcloudio/uni-cli-shared'
export function uniMainJsPlugin() {
return defineUniMainJsPlugin((opts) => {
......@@ -15,9 +11,7 @@ export function uniMainJsPlugin() {
? createApp(code)
: createLegacyApp(code)
return {
code:
`import './${PAGES_JSON_JS}';import '${UNI_MODULES_EXPORTS}';` +
code,
code: `import './${PAGES_JSON_JS}';` + code,
map: { mappings: '' },
}
}
......
import { parseInjects } from '../src/uni_modules'
describe('uni_modules:uni-ext-api', () => {
test('parseInjects', () => {
expect(
parseInjects('app', `@/uni_modules/uni-getbatteryinfo`, {
uni: 'getBatteryInfo',
})
).toEqual({
'uni.getBatteryInfo': '@/uni_modules/uni-getbatteryinfo',
})
expect(
parseInjects('app', `@/uni_modules/uni-getbatteryinfo`, {
uni: ['getBatteryInfo'],
})
).toEqual({
'uni.getBatteryInfo': [
'@/uni_modules/uni-getbatteryinfo',
'getBatteryInfo',
],
})
expect(
parseInjects('app', `@/uni_modules/uni-location`, {
uni: ['openLocation', 'chooseLocation'],
})
).toEqual({
'uni.openLocation': ['@/uni_modules/uni-location', 'openLocation'],
'uni.chooseLocation': ['@/uni_modules/uni-location', 'chooseLocation'],
})
expect(
parseInjects('app', `@/uni_modules/uni-capturescreen`, {
uni: {
onUserCaptureScreen: 'onCaptureScreen',
offUserCaptureScreen: 'offUserCaptureScreen',
},
})
).toEqual({
'uni.onUserCaptureScreen': [
'@/uni_modules/uni-capturescreen',
'onCaptureScreen',
],
'uni.offUserCaptureScreen': [
'@/uni_modules/uni-capturescreen',
'offUserCaptureScreen',
],
})
})
test('parseInjects with platform', () => {
expect(
parseInjects('web', `@/uni_modules/uni-getbatteryinfo`, {
uni: 'getBatteryInfo1',
web: {
uni: 'getBatteryInfo',
},
})
).toEqual({
'uni.getBatteryInfo': '@/uni_modules/uni-getbatteryinfo',
})
expect(
parseInjects('web', `@/uni_modules/uni-getbatteryinfo`, {
uni: 'getBatteryInfo1',
web: false,
})
).toEqual({})
expect(
parseInjects('web', `@/uni_modules/uni-location`, {
uni: ['openLocation'],
web: {
uni: ['chooseLocation'],
},
})
).toEqual({
'uni.chooseLocation': ['@/uni_modules/uni-location', 'chooseLocation'],
})
})
})
import { parseExports } from '../src/uni_modules'
describe('uni_modules:exports', () => {
test('parseExports', () => {
expect(
parseExports('app', `@/uni_modules/uni-getbatteryinfo`, {
uni: 'getBatteryInfo',
})
).toEqual([
["import getBatteryInfo from '@/uni_modules/uni-getbatteryinfo'"],
['uni.getBatteryInfo = getBatteryInfo'],
])
expect(
parseExports('app', `@/uni_modules/uni-getbatteryinfo`, {
uni: ['getBatteryInfo'],
})
).toEqual([
["import { getBatteryInfo } from '@/uni_modules/uni-getbatteryinfo'"],
['uni.getBatteryInfo = getBatteryInfo'],
])
expect(
parseExports('app', `@/uni_modules/uni-location`, {
uni: ['openLocation', 'chooseLocation'],
})
).toEqual([
[
"import { openLocation, chooseLocation } from '@/uni_modules/uni-location'",
],
[
'uni.openLocation = openLocation',
'uni.chooseLocation = chooseLocation',
],
])
expect(
parseExports('app', `@/uni_modules/uni-capturescreen`, {
uni: {
onUserCaptureScreen: 'onCaptureScreen',
offUserCaptureScreen: 'offUserCaptureScreen',
},
})
).toEqual([
[
"import { onCaptureScreen as onUserCaptureScreen, offUserCaptureScreen } from '@/uni_modules/uni-capturescreen'",
],
[
'uni.onUserCaptureScreen = onUserCaptureScreen',
'uni.offUserCaptureScreen = offUserCaptureScreen',
],
])
})
test('parseExports with platform', () => {
expect(
parseExports('web', `@/uni_modules/uni-getbatteryinfo`, {
uni: 'getBatteryInfo1',
web: {
uni: 'getBatteryInfo',
},
})
).toEqual([
["import getBatteryInfo from '@/uni_modules/uni-getbatteryinfo'"],
['uni.getBatteryInfo = getBatteryInfo'],
])
expect(
parseExports('web', `@/uni_modules/uni-getbatteryinfo`, {
uni: 'getBatteryInfo1',
web: false,
})
).toEqual([[], []])
expect(
parseExports('web', `@/uni_modules/uni-location`, {
uni: ['openLocation'],
web: {
uni: ['chooseLocation'],
},
})
).toEqual([
["import { chooseLocation } from '@/uni_modules/uni-location'"],
['uni.chooseLocation = chooseLocation'],
])
})
})
......@@ -17,7 +17,6 @@ export const extensions = [
'.json',
].concat(EXTNAME_VUE)
export const UNI_MODULES_EXPORTS = '\0uni-modules-exports'
export const PAGES_JSON_JS = 'pages-json-js'
export const MANIFEST_JSON_JS = 'manifest-json-js'
export const JSON_JS_MAP = {
......
......@@ -21,6 +21,8 @@ export * from './resolve'
export * from './scripts'
export * from './platform'
export { parseUniExtApis } from './uni_modules'
export { M } from './messages'
export * from './exports'
......
......@@ -2,7 +2,7 @@ import path from 'path'
import fs from 'fs-extra'
import { recursive } from 'merge'
type Define = string | string[] | Record<string, string>
type Define = string | string[] | Record<string, string> | false
type Defines = {
[name: string]: Define
}
......@@ -11,13 +11,13 @@ interface Exports {
[name: string]: Define | Defines | false
}
export function genUniModulesExports() {
export function parseUniExtApis() {
const uniModulesDir = path.resolve(process.env.UNI_INPUT_DIR, 'uni_modules')
if (!fs.existsSync(uniModulesDir)) {
return ''
return {}
}
const importCodes: string[] = []
const assignCodes: string[] = []
const injects: Injects = {}
fs.readdirSync(uniModulesDir).forEach((uniModuleDir) => {
// 必须以 uni- 开头
if (!uniModuleDir.startsWith('uni-')) {
......@@ -27,60 +27,26 @@ export function genUniModulesExports() {
if (!fs.existsSync(pkgPath)) {
return
}
const exports = JSON.parse(fs.readFileSync(pkgPath, 'utf8'))?.uni_modules
?.exports as Exports | undefined
const exports = JSON.parse(fs.readFileSync(pkgPath, 'utf8'))?.uni_modules?.[
'uni-ext-api'
] as Exports | undefined
if (exports) {
const [exportsImportCodes, exportsAssignCodes] = parseExports(
process.env.UNI_PLATFORM === 'h5' ? 'web' : process.env.UNI_PLATFORM,
`@/uni_modules/${uniModuleDir}`,
exports
Object.assign(
injects,
parseInjects(
process.env.UNI_PLATFORM === 'h5' ? 'web' : process.env.UNI_PLATFORM,
`@/uni_modules/${uniModuleDir}`,
exports
)
)
importCodes.push(...exportsImportCodes)
assignCodes.push(...exportsAssignCodes)
}
})
if (!importCodes.length) {
return ''
}
return `${importCodes.join('\n')}
${assignCodes.join('\n')}`
return injects
}
export function parseExports(
platform: UniApp.PLATFORM,
source: string,
exports: Exports = {}
): [string[], string[]] {
const rootDefines: Defines = {}
Object.keys(exports).forEach((name) => {
if (name.startsWith('uni')) {
rootDefines[name] = exports[name] as Define
}
})
const platformDefines = exports[platform] as false | Defines
// 该平台不支持
if (platformDefines === false) {
return [[], []]
}
return parseDefines(source, recursive(true, rootDefines, platformDefines))
}
export function parseDefines(
source: string,
defines: Defines = {}
): [string[], string[]] {
const importCodes: string[] = []
const assignCodes: string[] = []
Object.keys(defines).forEach((name) => {
const [defineImportCodes, defineAssignCodes] = parseDefine(
source,
name,
defines[name]
)
importCodes.push(...defineImportCodes)
assignCodes.push(...defineAssignCodes)
})
return [importCodes, assignCodes]
type Inject = string | string[]
type Injects = {
[name: string]: string | string[] | false
}
/**
* uni:'getBatteryInfo'
......@@ -103,34 +69,52 @@ export function parseDefines(
* @param define
* @returns
*/
function parseDefine(
export function parseInjects(
platform: UniApp.PLATFORM,
source: string,
exports: Exports = {}
) {
let rootDefines: Defines = {}
Object.keys(exports).forEach((name) => {
if (name.startsWith('uni')) {
rootDefines[name] = exports[name] as Inject
}
})
const platformDefines = exports[platform] as false | Defines
// 该平台不支持
if (platformDefines === false) {
return {}
}
if (platformDefines) {
rootDefines = recursive(true, rootDefines, platformDefines)
}
const injects: Injects = {}
for (const key in rootDefines) {
Object.assign(injects, parseInject(source, 'uni', rootDefines[key]))
}
return injects
}
export function parseInject(
source: string,
globalObject: string,
define: Define
): [string[], string[]] {
const importCodes: string[] = []
const assignCodes: string[] = []
if (typeof define === 'string') {
importCodes.push(`import ${define} from '${source}'`)
assignCodes.push(`${globalObject}.${define} = ${define}`)
) {
const injects: Injects = {}
if (define === false) {
} else if (typeof define === 'string') {
// {'uni.getBatteryInfo' : '@dcloudio/uni-getbatteryinfo'}
injects[globalObject + '.' + define] = source
} else if (Array.isArray(define)) {
importCodes.push(`import { ${define.join(', ')} } from '${source}'`)
// {'uni.getBatteryInfo' : ['@dcloudio/uni-getbatteryinfo','getBatteryInfo]}
define.forEach((d) => {
assignCodes.push(`${globalObject}.${d} = ${d}`)
injects[globalObject + '.' + d] = [source, d]
})
} else {
const keys = Object.keys(define)
const specifiers: string[] = []
keys.forEach((d) => {
if (d !== define[d]) {
specifiers.push(`${define[d]} as ${d}`)
} else {
specifiers.push(d)
}
assignCodes.push(`${globalObject}.${d} = ${d}`)
injects[globalObject + '.' + d] = [source, define[d]]
})
importCodes.push(`import { ${specifiers.join(', ')} } from '${source}'`)
}
return [importCodes, assignCodes]
return injects
}
......@@ -5,7 +5,6 @@ export * from './mainJs'
export * from './jsonJs'
export * from './console'
export * from './dynamicImportPolyfill'
export { uniModulesExportsPlugin } from './uniModules'
export { assetPlugin, getAssetHash } from './vitejs/plugins/asset'
export {
......
......@@ -23,7 +23,6 @@ import {
isJsFile,
isAssignmentExpression,
} from '../utils'
import { UNI_MODULES_EXPORTS } from '../../constants'
interface Scope {
parent: Scope
......@@ -84,11 +83,9 @@ export function uniViteInjectPlugin(
// 确保在 commonjs 之后,否则会混合 es6 module 与 cjs 的代码,导致 commonjs 失效
enforce: 'post',
transform(code, id) {
// 硬编码支持了uni_modules_exports
if (id !== UNI_MODULES_EXPORTS) {
if (!filter(id)) return null
if (!isJsFile(id)) return null
}
if (!filter(id)) return null
if (!isJsFile(id)) return null
debugInjectTry(id)
if (code.search(firstpass) === -1) return null
if (sep !== '/') id = id.split(sep).join('/')
......
import type { Plugin } from 'vite'
import { UNI_MODULES_EXPORTS } from '../../constants'
import { genUniModulesExports } from '../../uni_modules'
export function uniModulesExportsPlugin({
enable,
}: {
enable: boolean
}): Plugin {
return {
name: 'uni:modules:exports',
resolveId(id) {
if (id === UNI_MODULES_EXPORTS) {
return UNI_MODULES_EXPORTS
}
},
load(id) {
if (id !== UNI_MODULES_EXPORTS) {
return
}
// 未启用
if (!enable) {
return ''
}
return genUniModulesExports()
},
}
}
import path from 'path'
import {
EXTNAME_JS_RE,
EXTNAME_VUE,
UNI_MODULES_EXPORTS,
} from '../../constants'
import { EXTNAME_JS_RE, EXTNAME_VUE } from '../../constants'
export interface VueQuery {
vue?: boolean
......@@ -66,10 +62,6 @@ export const cleanUrl = (url: string) =>
url.replace(hashRE, '').replace(queryRE, '')
export function isJsFile(id: string) {
// inject 使用了isJsFile 判断。uni_modules_exports 中注入使用了 uni,在小程序平台,inject 需要注入 uni 对象
if (id === UNI_MODULES_EXPORTS) {
return true
}
const { filename, query } = parseVueRequest(id)
const isJs = EXTNAME_JS_RE.test(filename)
if (isJs) {
......
......@@ -2,7 +2,6 @@ import {
defineUniMainJsPlugin,
isSsr,
PAGES_JSON_JS,
UNI_MODULES_EXPORTS,
} from '@dcloudio/uni-cli-shared'
import { isSSR, isSsrManifest } from '../utils'
......@@ -27,7 +26,7 @@ export function uniMainJsPlugin() {
? createSSRServerApp(code)
: createSSRClientApp(code)
}
code = `import './${PAGES_JSON_JS}';import '${UNI_MODULES_EXPORTS}';${code}`
code = `import './${PAGES_JSON_JS}';${code}`
return {
code,
map: this.getCombinedSourcemap(),
......
......@@ -6718,8 +6718,10 @@ const useSwiperNavigation = (rootRef, props2, state, onSwiperDotClick, swiperCon
onMouseover: (event) => navigationHover(event, "over"),
onMouseout: (event) => navigationHover(event, "out")
};
function navigationClick($event, type) {
function navigationClick($event, type, disabled) {
$event.stopPropagation();
if (disabled)
return;
const swiperItemLength = swiperContext.value.length;
let _current = state.current;
switch (type) {
......@@ -6790,12 +6792,12 @@ const useSwiperNavigation = (rootRef, props2, state, onSwiperDotClick, swiperCon
"class": ["uni-swiper-navigation uni-swiper-navigation-prev", shared.extend({
"uni-swiper-navigation-disabled": prevDisabled
}, navigationClass)],
"onClick": (e2) => navigationClick(e2, "prev")
"onClick": (e2) => navigationClick(e2, "prev", prevDisabled)
}, navigationAttr), [createNavigationSVG()], 16, ["onClick"]), vue.createVNode("div", vue.mergeProps({
"class": ["uni-swiper-navigation uni-swiper-navigation-next", shared.extend({
"uni-swiper-navigation-disabled": nextDisabled
}, navigationClass)],
"onClick": (e2) => navigationClick(e2, "next")
"onClick": (e2) => navigationClick(e2, "next", nextDisabled)
}, navigationAttr), [createNavigationSVG()], 16, ["onClick"])]);
}
return null;
......
......@@ -14207,8 +14207,10 @@ const useSwiperNavigation = (rootRef, props2, state2, onSwiperDotClick, swiperCo
onMouseover: (event) => navigationHover(event, "over"),
onMouseout: (event) => navigationHover(event, "out")
};
function navigationClick($event, type) {
function navigationClick($event, type, disabled) {
$event.stopPropagation();
if (disabled)
return;
const swiperItemLength = swiperContext.value.length;
let _current = state2.current;
switch (type) {
......@@ -14280,12 +14282,12 @@ const useSwiperNavigation = (rootRef, props2, state2, onSwiperDotClick, swiperCo
"class": ["uni-swiper-navigation uni-swiper-navigation-prev", extend({
"uni-swiper-navigation-disabled": prevDisabled
}, navigationClass)],
"onClick": (e2) => navigationClick(e2, "prev")
"onClick": (e2) => navigationClick(e2, "prev", prevDisabled)
}, navigationAttr), [createNavigationSVG()], 16, ["onClick"]), createVNode("div", mergeProps({
"class": ["uni-swiper-navigation uni-swiper-navigation-next", extend({
"uni-swiper-navigation-disabled": nextDisabled
}, navigationClass)],
"onClick": (e2) => navigationClick(e2, "next")
"onClick": (e2) => navigationClick(e2, "next", nextDisabled)
}, navigationAttr), [createNavigationSVG()], 16, ["onClick"])]);
}
return null;
......
......@@ -1175,13 +1175,17 @@ function createIntersectionObserver(component, options) {
delete options.observeAll;
}
return swan.createIntersectionObserver(component, options);
}
function createVideoContext(videoId) {
return swan.createVideoContext(videoId);
}
var shims = /*#__PURE__*/Object.freeze({
__proto__: null,
getProvider: getProvider,
requestPayment: requestPayment,
createIntersectionObserver: createIntersectionObserver
createIntersectionObserver: createIntersectionObserver,
createVideoContext: createVideoContext
});
function createTodoMethod(contextName, methodName) {
......
......@@ -3,7 +3,6 @@ import {
PAGES_JSON_JS,
parseProgram,
transformDynamicImports,
UNI_MODULES_EXPORTS,
updateMiniProgramGlobalComponents,
withSourcemap,
} from '@dcloudio/uni-cli-shared'
......@@ -47,7 +46,7 @@ export function uniMainJsPlugin(
})
return {
code:
`import '\0plugin-vue:export-helper';import 'uni-mp-runtime';import './${PAGES_JSON_JS}';import '${UNI_MODULES_EXPORTS}';` +
`import '\0plugin-vue:export-helper';import 'uni-mp-runtime';import './${PAGES_JSON_JS}';` +
code,
map,
}
......
......@@ -13,9 +13,9 @@ import {
emptyDir,
initModuleAlias,
initPreContext,
parsePagesJsonOnce,
parseUniExtApis,
resolveSourceMapPath,
uniModulesExportsPlugin,
uniViteInjectPlugin,
} from '@dcloudio/uni-cli-shared'
import { createConfig } from './config'
......@@ -92,15 +92,8 @@ export default function uniPlugin(
initPreContext(options.platform, process.env.UNI_CUSTOM_CONTEXT)
const pagesJson = parsePagesJsonOnce(
process.env.UNI_INPUT_DIR,
process.env.UNI_PLATFORM
)
const plugins: Plugin[] = [
uniModulesExportsPlugin({
enable: pagesJson.uni_modules?.exports === false ? false : true,
}),
uniViteInjectPlugin('uni:ext-api-inject', parseUniExtApis()),
]
// 仅限 h5
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册