From 589151b56cfe569c513d801ad2733c0f35b03d5d Mon Sep 17 00:00:00 2001 From: fxy060608 Date: Mon, 17 Oct 2022 13:39:47 +0800 Subject: [PATCH] feat(cli): uni ext api --- packages/uni-cli-shared/lib/index.js | 3 +- .../uni-cli-shared/lib/uni_modules-loader.js | 8 -- .../lib/uni_modules/uni_modules.js | 101 ++++++++---------- .../vue-cli-plugin-uni/lib/app-plus/index.js | 5 +- .../lib/configure-webpack.js | 31 ++++-- packages/vue-cli-plugin-uni/lib/h5/index.js | 5 +- packages/vue-cli-plugin-uni/lib/mp/index.js | 5 +- 7 files changed, 70 insertions(+), 88 deletions(-) delete mode 100644 packages/uni-cli-shared/lib/uni_modules-loader.js diff --git a/packages/uni-cli-shared/lib/index.js b/packages/uni-cli-shared/lib/index.js index ea7878eaf3..287524be42 100644 --- a/packages/uni-cli-shared/lib/index.js +++ b/packages/uni-cli-shared/lib/index.js @@ -112,6 +112,5 @@ module.exports = { getPlatformGlobal, getPlatformStat, getPlatformPush, - getPlatformUniCloud, - uniModulesLoader: normalizePath(require.resolve('./uni_modules-loader')) + getPlatformUniCloud } diff --git a/packages/uni-cli-shared/lib/uni_modules-loader.js b/packages/uni-cli-shared/lib/uni_modules-loader.js deleted file mode 100644 index a630c374e5..0000000000 --- a/packages/uni-cli-shared/lib/uni_modules-loader.js +++ /dev/null @@ -1,8 +0,0 @@ -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 index 4dd1014bdd..3e5bda326c 100644 --- a/packages/uni-cli-shared/lib/uni_modules/uni_modules.js +++ b/packages/uni-cli-shared/lib/uni_modules/uni_modules.js @@ -3,17 +3,16 @@ 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; +exports.parseInject = exports.parseInjects = exports.parseUniExtApis = void 0; const path_1 = __importDefault(require("path")); const fs_extra_1 = __importDefault(require("fs-extra")); const merge_1 = require("merge"); -function genUniModulesExports() { +function parseUniExtApis() { const uniModulesDir = path_1.default.resolve(process.env.UNI_INPUT_DIR, 'uni_modules'); if (!fs_extra_1.default.existsSync(uniModulesDir)) { - return ''; + return {}; } - const importCodes = []; - const assignCodes = []; + const injects = {}; fs_extra_1.default.readdirSync(uniModulesDir).forEach((uniModuleDir) => { var _a, _b; // 必须以 uni- 开头 @@ -24,46 +23,14 @@ function genUniModulesExports() { 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; + 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['uni-ext-api']; 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); + Object.assign(injects, parseInjects(process.env.UNI_PLATFORM === 'h5' ? 'web' : process.env.UNI_PLATFORM, `@/uni_modules/${uniModuleDir}`, exports)); } }); - 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]; + return injects; } -exports.parseDefines = parseDefines; +exports.parseUniExtApis = parseUniExtApis; /** * uni:'getBatteryInfo' * import getBatteryInfo from '..' @@ -85,32 +52,48 @@ exports.parseDefines = parseDefines; * @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}`); +function parseInjects(platform, source, exports = {}) { + let rootDefines = {}; + Object.keys(exports).forEach((name) => { + if (name.startsWith('uni')) { + rootDefines[name] = exports[name]; + } + }); + const platformDefines = exports[platform]; + // 该平台不支持 + if (platformDefines === false) { + return {}; + } + if (platformDefines) { + rootDefines = (0, merge_1.recursive)(true, rootDefines, platformDefines); + } + const injects = {}; + for (const key in rootDefines) { + Object.assign(injects, parseInject(source, 'uni', rootDefines[key])); + } + return injects; +} +exports.parseInjects = parseInjects; +function parseInject(source, globalObject, define) { + const 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 = []; 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; } +exports.parseInject = parseInject; 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 b0c9abe5ab..4e0e184304 100644 --- a/packages/vue-cli-plugin-uni/lib/app-plus/index.js +++ b/packages/vue-cli-plugin-uni/lib/app-plus/index.js @@ -5,8 +5,7 @@ const { getMainEntry, getPlatformStat, getPlatformPush, - getPlatformUniCloud, - uniModulesLoader + getPlatformUniCloud } = require('@dcloudio/uni-cli-shared') const vueLoader = require('@dcloudio/uni-cli-shared/lib/vue-loader') @@ -66,7 +65,7 @@ const v3 = { const pushCode = getPlatformPush() const uniCloudCode = getPlatformUniCloud() - const beforeCode = `import 'uni-pages';import '${uniModulesLoader}!';` + const beforeCode = 'import \'uni-pages\';' if (!webpackConfig.optimization) { webpackConfig.optimization = {} } diff --git a/packages/vue-cli-plugin-uni/lib/configure-webpack.js b/packages/vue-cli-plugin-uni/lib/configure-webpack.js index 40c0eaf894..ae0158cf50 100644 --- a/packages/vue-cli-plugin-uni/lib/configure-webpack.js +++ b/packages/vue-cli-plugin-uni/lib/configure-webpack.js @@ -73,8 +73,8 @@ module.exports = function configureWebpack (platformOptions, manifestPlatformOpt const normalized = RuleSet.normalizeRule(clone, {}, '') return ( !rule.enforce && - normalized.resource && - normalized.resource(fakeFile) + normalized.resource && + normalized.resource(fakeFile) ) } } @@ -230,7 +230,10 @@ module.exports = function configureWebpack (platformOptions, manifestPlatformOpt webpackConfig.resolve.modules = webpackConfig.resolve.modules.filter(module => module !== 'node_modules') } - const plugins = [] + const plugins = [ + new webpack.ProvidePlugin(require('@dcloudio/uni-cli-shared/lib/uni_modules/uni_modules') + .parseUniExtApis()) + ] const isAppView = process.env.UNI_PLATFORM === 'app-plus' && vueOptions.pluginOptions && @@ -239,7 +242,9 @@ module.exports = function configureWebpack (platformOptions, manifestPlatformOpt if (!isAppView) { // app-plus view不需要copy const patterns = getCopyWebpackPluginOptions(manifestPlatformOptions, vueOptions) - plugins.push(new CopyWebpackPlugin(CopyWebpackPluginVersion > 5 ? { patterns } : patterns)) + plugins.push(new CopyWebpackPlugin(CopyWebpackPluginVersion > 5 ? { + patterns + } : patterns)) } if (!process.env.UNI_SUBPACKGE || !process.env.UNI_MP_PLUGIN) { try { @@ -258,8 +263,10 @@ module.exports = function configureWebpack (platformOptions, manifestPlatformOpt return '' } }] - plugins.push(new CopyWebpackPlugin(CopyWebpackPluginVersion > 5 ? { patterns } : patterns)) - } catch (e) { } + plugins.push(new CopyWebpackPlugin(CopyWebpackPluginVersion > 5 ? { + patterns + } : patterns)) + } catch (e) {} } if (process.UNI_SCRIPT_ENV && Object.keys(process.UNI_SCRIPT_ENV).length) { @@ -309,7 +316,8 @@ module.exports = function configureWebpack (platformOptions, manifestPlatformOpt }) } - if (process.env.NODE_ENV === 'development' || (process.env.NODE_ENV === 'production' && process.env.SOURCEMAP === 'true')) { + if (process.env.NODE_ENV === 'development' || (process.env.NODE_ENV === 'production' && process.env + .SOURCEMAP === 'true')) { const sourceMap = require('@dcloudio/uni-cli-shared/lib/source-map') let isAppService = false if ( @@ -331,7 +339,9 @@ module.exports = function configureWebpack (platformOptions, manifestPlatformOpt noSources: true, append: false } - if (isInHBuilderX && process.env.SOURCEMAP_PATH) { sourceMapOptions.filename = process.env.SOURCEMAP_PATH } + if (isInHBuilderX && process.env.SOURCEMAP_PATH) { + sourceMapOptions.filename = process.env.SOURCEMAP_PATH + } if (useEvalSourceMap || useSourceMap) { plugins.push(sourceMap.createSourceMapDevToolPlugin(!sourceMapOptions.filename, sourceMapOptions)) } @@ -339,7 +349,8 @@ module.exports = function configureWebpack (platformOptions, manifestPlatformOpt if (useEvalSourceMap) { plugins.push(sourceMap.createEvalSourceMapDevToolPlugin()) } else if (useSourceMap) { - plugins.push(sourceMap.createSourceMapDevToolPlugin(process.env.UNI_PLATFORM === 'mp-weixin' || process.env.UNI_PLATFORM === 'mp-toutiao')) + plugins.push(sourceMap.createSourceMapDevToolPlugin(process.env.UNI_PLATFORM === 'mp-weixin' || process + .env.UNI_PLATFORM === 'mp-toutiao')) } } } @@ -407,4 +418,4 @@ module.exports = function configureWebpack (platformOptions, manifestPlatformOpt watchOptions: require('./util').getWatchOptions() }, platformWebpackConfig) } -} +} diff --git a/packages/vue-cli-plugin-uni/lib/h5/index.js b/packages/vue-cli-plugin-uni/lib/h5/index.js index e1ebb66350..66e1695aeb 100644 --- a/packages/vue-cli-plugin-uni/lib/h5/index.js +++ b/packages/vue-cli-plugin-uni/lib/h5/index.js @@ -7,8 +7,7 @@ const { getH5Options, getPlatformStat, getPlatformPush, - getPlatformUniCloud, - uniModulesLoader + getPlatformUniCloud } = require('@dcloudio/uni-cli-shared') const { @@ -104,7 +103,7 @@ module.exports = { } catch (e) {} const beforeCode = (useBuiltIns === 'entry' ? 'import \'@babel/polyfill\';' : '') + - `import 'uni-pages';import 'uni-${process.env.UNI_PLATFORM}';import '${uniModulesLoader}!';` + `import 'uni-pages';import 'uni-${process.env.UNI_PLATFORM}';` return { resolve: { diff --git a/packages/vue-cli-plugin-uni/lib/mp/index.js b/packages/vue-cli-plugin-uni/lib/mp/index.js index b204449d81..c708a89fd9 100644 --- a/packages/vue-cli-plugin-uni/lib/mp/index.js +++ b/packages/vue-cli-plugin-uni/lib/mp/index.js @@ -9,8 +9,7 @@ const { getPlatformCssnano, getPlatformStat, getPlatformPush, - getPlatformUniCloud, - uniModulesLoader + getPlatformUniCloud } = require('@dcloudio/uni-cli-shared') const WebpackUniAppPlugin = require('../../packages/webpack-uni-app-loader/plugin/index') @@ -182,7 +181,7 @@ module.exports = { const pushCode = getPlatformPush() const uniCloudCode = getPlatformUniCloud() - let beforeCode = `import 'uni-pages';import '${uniModulesLoader}!';` + let beforeCode = 'import \'uni-pages\';' const plugins = [ new WebpackUniAppPlugin(), -- GitLab