From e42ead51ea9105e7c280211970aca8b5278a0e93 Mon Sep 17 00:00:00 2001 From: fxy060608 Date: Fri, 14 Oct 2022 13:55:36 +0800 Subject: [PATCH] feat(uni_modules): support exports --- .eslintignore | 3 +- packages/uni-cli-shared/lib/index.js | 5 +- .../uni-cli-shared/lib/uni_modules-loader.js | 8 ++ .../lib/uni_modules/uni_modules.js | 109 ++++++++++++++++++ .../vue-cli-plugin-uni/lib/app-plus/index.js | 9 +- packages/vue-cli-plugin-uni/lib/h5/index.js | 7 +- packages/vue-cli-plugin-uni/lib/mp/index.js | 5 +- 7 files changed, 134 insertions(+), 12 deletions(-) create mode 100644 packages/uni-cli-shared/lib/uni_modules-loader.js create mode 100644 packages/uni-cli-shared/lib/uni_modules/uni_modules.js diff --git a/.eslintignore b/.eslintignore index 33e964686..c51ed8fb3 100644 --- a/.eslintignore +++ b/.eslintignore @@ -39,4 +39,5 @@ uni-polyfill.js packages/uni-cli-shared/components/ad-fullscreen-video.vue packages/uni-cli-shared/components/ad-interactive.vue packages/uni-cli-shared/components/ad-interstitial.vue -packages/uni-cli-shared/components/ad-rewarded-video.vue +packages/uni-cli-shared/components/ad-rewarded-video.vue +packages/uni-cli-shared/lib/uni_modules/uni_modules.js diff --git a/packages/uni-cli-shared/lib/index.js b/packages/uni-cli-shared/lib/index.js index 70528402f..ea7878eaf 100644 --- a/packages/uni-cli-shared/lib/index.js +++ b/packages/uni-cli-shared/lib/index.js @@ -112,5 +112,6 @@ module.exports = { getPlatformGlobal, getPlatformStat, getPlatformPush, - getPlatformUniCloud -} + getPlatformUniCloud, + uniModulesLoader: normalizePath(require.resolve('./uni_modules-loader')) +} diff --git a/packages/uni-cli-shared/lib/uni_modules-loader.js b/packages/uni-cli-shared/lib/uni_modules-loader.js new file mode 100644 index 000000000..a630c374e --- /dev/null +++ b/packages/uni-cli-shared/lib/uni_modules-loader.js @@ -0,0 +1,8 @@ +const { + genUniModulesExports +} = require('./uni_modules/uni_modules') + +module.exports = function () { + this.cacheable && this.cacheable() + return genUniModulesExports() +} diff --git a/packages/uni-cli-shared/lib/uni_modules/uni_modules.js b/packages/uni-cli-shared/lib/uni_modules/uni_modules.js new file mode 100644 index 000000000..ae8b1789e --- /dev/null +++ b/packages/uni-cli-shared/lib/uni_modules/uni_modules.js @@ -0,0 +1,109 @@ +'use strict' +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { default: mod } +} +Object.defineProperty(exports, '__esModule', { value: true }) +exports.parseDefines = exports.parseExports = exports.genUniModulesExports = void 0 +const path_1 = __importDefault(require('path')) +const fs_extra_1 = __importDefault(require('fs-extra')) +const merge_1 = require('merge') +function genUniModulesExports () { + const uniModulesDir = path_1.default.resolve(process.env.UNI_INPUT_DIR, 'uni_modules') + if (!fs_extra_1.default.existsSync(uniModulesDir)) { + return '' + } + const importCodes = [] + const assignCodes = [] + fs_extra_1.default.readdirSync(uniModulesDir).forEach((uniModuleDir) => { + var _a, _b + const pkgPath = path_1.default.resolve(uniModulesDir, uniModuleDir, 'package.json') + if (!fs_extra_1.default.existsSync(pkgPath)) { + return + } + const exports = (_b = (_a = JSON.parse(fs_extra_1.default.readFileSync(pkgPath, 'utf8'))) === null || _a === void 0 ? void 0 : _a.uni_modules) === null || _b === void 0 ? void 0 : _b.exports + if (exports) { + const [exportsImportCodes, exportsAssignCodes] = parseExports(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')}` +} +exports.genUniModulesExports = genUniModulesExports +function parseExports (platform, source, exports = {}) { + const rootDefines = {} + Object.keys(exports).forEach((name) => { + if (name.startsWith('uni')) { + rootDefines[name] = exports[name] + } + }) + const platformDefines = exports[platform] + // 该平台不支持 + if (platformDefines === false) { + return [[], []] + } + return parseDefines(source, (0, merge_1.recursive)(true, rootDefines, platformDefines)) +} +exports.parseExports = parseExports +function parseDefines (source, defines = {}) { + const importCodes = [] + const assignCodes = [] + Object.keys(defines).forEach((name) => { + const [defineImportCodes, defineAssignCodes] = parseDefine(source, name, defines[name]) + importCodes.push(...defineImportCodes) + assignCodes.push(...defineAssignCodes) + }) + return [importCodes, assignCodes] +} +exports.parseDefines = parseDefines +/** + * uni:'getBatteryInfo' + * import getBatteryInfo from '..' + * + * uni:['getBatteryInfo'] + * import { getBatteryInfo } from '..' + * + * uni:['openLocation','chooseLocation'] + * import { openLocation, chooseLocation } from '..' + * + * uni:{ + * onUserCaptureScreen: "onCaptureScreen" + * offUserCaptureScreen: "offCaptureScreen" + * } + * + * uni.getBatteryInfo = getBatteryInfo + * @param source + * @param globalObject + * @param define + * @returns + */ +function parseDefine (source, globalObject, define) { + const importCodes = [] + const assignCodes = [] + if (typeof define === 'string') { + importCodes.push(`import ${define} from '${source}'`) + assignCodes.push(`${globalObject}.${define} = ${define}`) + } else if (Array.isArray(define)) { + importCodes.push(`import { ${define.join(', ')} } from '${source}'`) + define.forEach((d) => { + assignCodes.push(`${globalObject}.${d} = ${d}`) + }) + } else { + const keys = Object.keys(define) + const specifiers = [] + keys.forEach((d) => { + if (d !== define[d]) { + specifiers.push(`${define[d]} as ${d}`) + } else { + specifiers.push(d) + } + assignCodes.push(`${globalObject}.${d} = ${d}`) + }) + importCodes.push(`import { ${specifiers.join(', ')} } from '${source}'`) + } + return [importCodes, assignCodes] +} diff --git a/packages/vue-cli-plugin-uni/lib/app-plus/index.js b/packages/vue-cli-plugin-uni/lib/app-plus/index.js index 88935bb52..b0c9abe5a 100644 --- a/packages/vue-cli-plugin-uni/lib/app-plus/index.js +++ b/packages/vue-cli-plugin-uni/lib/app-plus/index.js @@ -5,7 +5,8 @@ const { getMainEntry, getPlatformStat, getPlatformPush, - getPlatformUniCloud + getPlatformUniCloud, + uniModulesLoader } = require('@dcloudio/uni-cli-shared') const vueLoader = require('@dcloudio/uni-cli-shared/lib/vue-loader') @@ -65,7 +66,7 @@ const v3 = { const pushCode = getPlatformPush() const uniCloudCode = getPlatformUniCloud() - const beforeCode = 'import \'uni-pages\';' + const beforeCode = `import 'uni-pages';import '${uniModulesLoader}!';` if (!webpackConfig.optimization) { webpackConfig.optimization = {} } @@ -163,7 +164,7 @@ const v3 = { compiler: vueLoader.compiler, before: [ beforeCode + require('../util').getAutomatorCode() + statCode + pushCode + uniCloudCode + - getGlobalUsingComponentsCode() + getGlobalUsingComponentsCode() ] } }] @@ -278,4 +279,4 @@ if (process.env.UNI_USING_V3) { module.exports = v3 } else { module.exports = require('../mp') -} +} diff --git a/packages/vue-cli-plugin-uni/lib/h5/index.js b/packages/vue-cli-plugin-uni/lib/h5/index.js index d0d621ba7..e1ebb6635 100644 --- a/packages/vue-cli-plugin-uni/lib/h5/index.js +++ b/packages/vue-cli-plugin-uni/lib/h5/index.js @@ -7,7 +7,8 @@ const { getH5Options, getPlatformStat, getPlatformPush, - getPlatformUniCloud + getPlatformUniCloud, + uniModulesLoader } = require('@dcloudio/uni-cli-shared') const { @@ -103,7 +104,7 @@ module.exports = { } catch (e) {} const beforeCode = (useBuiltIns === 'entry' ? 'import \'@babel/polyfill\';' : '') + - `import 'uni-pages';import 'uni-${process.env.UNI_PLATFORM}';` + `import 'uni-pages';import 'uni-${process.env.UNI_PLATFORM}';import '${uniModulesLoader}!';` return { resolve: { @@ -194,4 +195,4 @@ module.exports = { require('./cssnano-options')(webpackConfig) } } -} +} diff --git a/packages/vue-cli-plugin-uni/lib/mp/index.js b/packages/vue-cli-plugin-uni/lib/mp/index.js index c708a89fd..b204449d8 100644 --- a/packages/vue-cli-plugin-uni/lib/mp/index.js +++ b/packages/vue-cli-plugin-uni/lib/mp/index.js @@ -9,7 +9,8 @@ const { getPlatformCssnano, getPlatformStat, getPlatformPush, - getPlatformUniCloud + getPlatformUniCloud, + uniModulesLoader } = require('@dcloudio/uni-cli-shared') const WebpackUniAppPlugin = require('../../packages/webpack-uni-app-loader/plugin/index') @@ -181,7 +182,7 @@ module.exports = { const pushCode = getPlatformPush() const uniCloudCode = getPlatformUniCloud() - let beforeCode = 'import \'uni-pages\';' + let beforeCode = `import 'uni-pages';import '${uniModulesLoader}!';` const plugins = [ new WebpackUniAppPlugin(), -- GitLab