From e0f172ef93a637d5e6cc20c08221f42054abc8d4 Mon Sep 17 00:00:00 2001 From: fxy060608 Date: Thu, 22 Aug 2019 19:03:27 +0800 Subject: [PATCH] feat(cli): wxs,filter,import-sjs --- packages/uni-cli-shared/lib/platform.js | 19 ++++++++++--- packages/uni-cli-shared/package.json | 2 +- packages/uni-template-compiler/lib/index.js | 17 +++++++----- .../lib/platforms/mp-alipay.js | 5 ++++ .../lib/platforms/mp-base.js | 23 ++++++++++++---- packages/uni-template-compiler/package.json | 2 +- packages/vue-cli-plugin-uni/lib/h5/index.js | 19 ++++++++++--- packages/vue-cli-plugin-uni/lib/mp.js | 13 +++++++++ packages/vue-cli-plugin-uni/package.json | 2 +- .../webpack-custom-block-loader/index.js | 24 ++++++++++------- .../webpack-uni-filter-loader/index.js | 27 +++++++++++++++++++ packages/webpack-uni-mp-loader/lib/shared.js | 14 +++------- packages/webpack-uni-mp-loader/package.json | 2 +- .../webpack-uni-pages-loader/package.json | 4 +-- 14 files changed, 129 insertions(+), 44 deletions(-) create mode 100644 packages/vue-cli-plugin-uni/packages/webpack-uni-filter-loader/index.js diff --git a/packages/uni-cli-shared/lib/platform.js b/packages/uni-cli-shared/lib/platform.js index 888f10b9e..0b514c9ba 100644 --- a/packages/uni-cli-shared/lib/platform.js +++ b/packages/uni-cli-shared/lib/platform.js @@ -79,7 +79,8 @@ const PLATFORMS = { exts: false, vue: '@dcloudio/vue-cli-plugin-uni/packages/h5-vue', compiler: false, - megalo: false, + megalo: false, + filterTag: 'wxs', subPackages: false, cssVars: { '--status-bar-height': '0px' @@ -398,8 +399,20 @@ function devtoolModuleFilenameTemplate (info) { ) { return `uni-app:///${filePath}` } -} -module.exports = { +} + +const NODE_MODULES_REGEX = /(\.\.\/)?node_modules/g + +function normalizeNodeModules (str) { + str = str.replace(NODE_MODULES_REGEX, 'node-modules') + if (process.env.UNI_PLATFORM === 'mp-alipay') { + str = str.replace('node-modules/@', 'node-modules/npm-scope-') + } + return str +} + +module.exports = { + normalizeNodeModules, isInHBuilderX, isInHBuilderXAlpha, runByHBuilderX: isInHBuilderX || !!process.env.UNI_HBUILDERX_PLUGINS, diff --git a/packages/uni-cli-shared/package.json b/packages/uni-cli-shared/package.json index a90403943..8f69c062b 100644 --- a/packages/uni-cli-shared/package.json +++ b/packages/uni-cli-shared/package.json @@ -1,6 +1,6 @@ { "name": "@dcloudio/uni-cli-shared", - "version": "0.2.989", + "version": "0.2.990", "description": "uni-cli-shared", "main": "lib/index.js", "files": [ diff --git a/packages/uni-template-compiler/lib/index.js b/packages/uni-template-compiler/lib/index.js index 6eccbba99..9e6b3cd5e 100644 --- a/packages/uni-template-compiler/lib/index.js +++ b/packages/uni-template-compiler/lib/index.js @@ -100,15 +100,18 @@ at ${resourcePath}.vue:1`) } const filterTemplate = [] options.mp.filterModules.forEach(name => { - const filterTag = options.filterTagName - const filterModule = options.filterModules[name] - if (filterModule.content) { - filterTemplate.push(`<${filterTag} module="${name}"> -${filterModule.content} -`) - } + filterTemplate.push( + options.mp.platform.createFilterTag( + options.filterTagName, + options.filterModules[name] + ) + ) }) + if (filterTemplate.length) { + template = filterTemplate.join('\n') + '\n' + template + } + if ( process.UNI_ENTRY[resourcePath] && process.env.UNI_PLATFORM !== 'app-plus' && diff --git a/packages/uni-template-compiler/lib/platforms/mp-alipay.js b/packages/uni-template-compiler/lib/platforms/mp-alipay.js index 7ef7d8c6d..f9abfc174 100644 --- a/packages/uni-template-compiler/lib/platforms/mp-alipay.js +++ b/packages/uni-template-compiler/lib/platforms/mp-alipay.js @@ -42,6 +42,11 @@ module.exports = { 'regionchange': 'onRegionChange' } }, + createFilterTag (filterTag, { + attrs + }) { + return `<${filterTag} name="${attrs.module}" from="${attrs.src}">` + }, getEventType (eventType) { return EVENTS[eventType] || eventType }, diff --git a/packages/uni-template-compiler/lib/platforms/mp-base.js b/packages/uni-template-compiler/lib/platforms/mp-base.js index a17835913..b7af2fa38 100644 --- a/packages/uni-template-compiler/lib/platforms/mp-base.js +++ b/packages/uni-template-compiler/lib/platforms/mp-base.js @@ -46,7 +46,7 @@ const tags = [ 'textarea', 'video', 'view', - 'web-view', + 'web-view', 'editor' ] @@ -55,13 +55,26 @@ module.exports = { refInFor: 'data-ref-in-for', specialEvents: {}, /** - * TODO 暂时先简单判断是不是自定义组件, - * 如果要依赖真实导入的组件识别,需要 template-loader 与 script-loader 结合, - * 目前 template 在前,script 在后,要做的话,就需要把 wxml 的生成机制放到 plugin 中才可以拿到真实的组件列表 - */ + * TODO 暂时先简单判断是不是自定义组件, + * 如果要依赖真实导入的组件识别,需要 template-loader 与 script-loader 结合, + * 目前 template 在前,script 在后,要做的话,就需要把 wxml 的生成机制放到 plugin 中才可以拿到真实的组件列表 + */ isComponent (tagName) { return !tags.includes(tagName) }, + createFilterTag (filterTag, { + content, + attrs + }) { + content = content.trim() + if (content) { + return `<${filterTag} module="${attrs.module}"> +${content} +` + } else if (attrs.src) { + return `<${filterTag} src="${attrs.src}" module="${attrs.module}">` + } + }, getEventType (eventType) { return EVENTS[eventType] || eventType }, diff --git a/packages/uni-template-compiler/package.json b/packages/uni-template-compiler/package.json index f8e07225e..8d44782ea 100644 --- a/packages/uni-template-compiler/package.json +++ b/packages/uni-template-compiler/package.json @@ -1,6 +1,6 @@ { "name": "@dcloudio/uni-template-compiler", - "version": "1.0.0-alpha-22120190814002", + "version": "0.9.182", "description": "uni-template-compiler", "main": "lib/index.js", "files": [ diff --git a/packages/vue-cli-plugin-uni/lib/h5/index.js b/packages/vue-cli-plugin-uni/lib/h5/index.js index ed136daae..28683ab11 100644 --- a/packages/vue-cli-plugin-uni/lib/h5/index.js +++ b/packages/vue-cli-plugin-uni/lib/h5/index.js @@ -80,6 +80,11 @@ module.exports = { before: [``] } } + }, { + resourceQuery: /blockType=wxs/, + use: [{ + loader: resolve('packages/webpack-uni-filter-loader') + }] }] }, resolveLoader: { @@ -90,7 +95,7 @@ module.exports = { plugins } }, - chainWebpack (webpackConfig) { + chainWebpack (webpackConfig) { webpackConfig.plugins.delete('copy') if (!process.env.UNI_OPT_PREFETCH) { @@ -106,16 +111,22 @@ module.exports = { .use('vue-loader') .tap(options => Object.assign(options, { compiler: getPlatformCompiler(), - compilerOptions: require('./compiler-options'), - cacheDirectory: false, + compilerOptions: require('./compiler-options'), + cacheDirectory: false, cacheIdentifier: false })) .end() + .use('uniapp-custom-block-loader') + .loader(require.resolve('@dcloudio/vue-cli-plugin-uni/packages/webpack-custom-block-loader')) + .options({ + compiler: getPlatformCompiler() + }) + .end() .use('uniapp-scoped') .loader(resolve('packages/webpack-scoped-loader')) .end() .uses - .delete('cache-loader') + .delete('cache-loader') if (process.env.NODE_ENV === 'production') { const module = webpackConfig.module diff --git a/packages/vue-cli-plugin-uni/lib/mp.js b/packages/vue-cli-plugin-uni/lib/mp.js index a2d2bd2b0..1742c1ac9 100644 --- a/packages/vue-cli-plugin-uni/lib/mp.js +++ b/packages/vue-cli-plugin-uni/lib/mp.js @@ -119,6 +119,12 @@ module.exports = { use: [{ loader: '@dcloudio/webpack-uni-mp-loader/lib/template' }] + }, { + resourceQuery: [/blockType=wxs/, /blockType=filter/, /blockType=import-sjs/], + use: [{ + loader: require.resolve( + '@dcloudio/vue-cli-plugin-uni/packages/webpack-uni-filter-loader') + }] }] }, plugins: [ @@ -128,6 +134,13 @@ module.exports = { } }, chainWebpack (webpackConfig) { + if (process.env.UNI_PLATFORM === 'mp-baidu') { + webpackConfig.module + .rule('js') + .exclude + .add(/\.filter\.js$/) + } + // disable vue cache-loader webpackConfig.module .rule('vue') diff --git a/packages/vue-cli-plugin-uni/package.json b/packages/vue-cli-plugin-uni/package.json index bce7a7673..b4e067a96 100644 --- a/packages/vue-cli-plugin-uni/package.json +++ b/packages/vue-cli-plugin-uni/package.json @@ -1,6 +1,6 @@ { "name": "@dcloudio/vue-cli-plugin-uni", - "version": "0.9.525", + "version": "0.9.527", "description": "uni-app plugin for vue-cli 3", "main": "index.js", "scripts": { diff --git a/packages/vue-cli-plugin-uni/packages/webpack-custom-block-loader/index.js b/packages/vue-cli-plugin-uni/packages/webpack-custom-block-loader/index.js index a1758b593..6a0206825 100644 --- a/packages/vue-cli-plugin-uni/packages/webpack-custom-block-loader/index.js +++ b/packages/vue-cli-plugin-uni/packages/webpack-custom-block-loader/index.js @@ -8,15 +8,13 @@ const { })) // 确保使用的与 vue-loader 一致 const { - getPlatformFilterTag + getPlatformFilterTag, + normalizeNodeModules } = require('@dcloudio/uni-cli-shared/lib/platform') const FILTER_TAG = getPlatformFilterTag() module.exports = function(source) { - if (!FILTER_TAG) { - return source - } const loaderContext = this @@ -40,23 +38,31 @@ module.exports = function(source) { needMap: sourceMap }) - if (!descriptor.template) { + if (!descriptor.template || !FILTER_TAG) { + // delete customBlocks + descriptor.customBlocks.length = 0 return source } const modules = Object.create(null) - descriptor.customBlocks.filter(block => { + descriptor.customBlocks = descriptor.customBlocks.filter(block => { if (block.type === FILTER_TAG && block.attrs.module) { modules[block.attrs.module] = block + return true } }) if (Object.keys(modules)) { - descriptor.template.attrs['filter-modules'] = JSON.stringify(modules) + const filterModules = JSON.parse(JSON.stringify(modules)) + Object.keys(filterModules).forEach(name => { + const filterModule = filterModules[name] + if (filterModule.attrs.src) { + filterModule.attrs.src = normalizeNodeModules(filterModule.attrs.src) + } + }) + descriptor.template.attrs['filter-modules'] = JSON.stringify(filterModules) } - // delete customBlocks - descriptor.customBlocks.length = 0 return source } diff --git a/packages/vue-cli-plugin-uni/packages/webpack-uni-filter-loader/index.js b/packages/vue-cli-plugin-uni/packages/webpack-uni-filter-loader/index.js new file mode 100644 index 000000000..e9dec9410 --- /dev/null +++ b/packages/vue-cli-plugin-uni/packages/webpack-uni-filter-loader/index.js @@ -0,0 +1,27 @@ +const path = require('path') +const loaderUtils = require('loader-utils') +const { + normalizeNodeModules +} = require('@dcloudio/uni-cli-shared/lib/platform') + +module.exports = function(source, map) { + const params = loaderUtils.parseQuery(this.resourceQuery) + if (process.env.UNI_PLATFORM === 'h5') { // h5 + this.callback( + null, + `export default function (Component) { + (Component.options.wxs||(Component.options.wxs={}))['${params.module}'] = (function(module){ + ${source.trim()} + return module.exports + })({exports:{}}); + }`, + map + ) + } else { // mp + if (params.issuerPath) { + const resourcePath = normalizeNodeModules(path.relative(process.env.UNI_INPUT_DIR, this.resourcePath)) + this.emitFile(resourcePath, source) + } + this.callback(null, `export default {}`, map) + } +} diff --git a/packages/webpack-uni-mp-loader/lib/shared.js b/packages/webpack-uni-mp-loader/lib/shared.js index 9ba79bef7..06d01d187 100644 --- a/packages/webpack-uni-mp-loader/lib/shared.js +++ b/packages/webpack-uni-mp-loader/lib/shared.js @@ -3,8 +3,10 @@ const { getPlatformExts, getPlatformTarget } = require('@dcloudio/uni-cli-shared') - -const NODE_MODULES_REGEX = /(\.\.\/)?node_modules/g + +const { + normalizeNodeModules +} = require('@dcloudio/uni-cli-shared/lib/platform') const templates = {} const compilerOptions = {} @@ -29,14 +31,6 @@ function resolve (source) { }) } -function normalizeNodeModules (str) { - str = str.replace(NODE_MODULES_REGEX, 'node-modules') - if (process.env.UNI_PLATFORM === 'mp-alipay') { - str = str.replace('node-modules/@', 'node-modules/npm-scope-') - } - return str -} - function restoreNodeModules (str) { if (process.env.UNI_PLATFORM === 'mp-alipay') { str = str.replace('node-modules/npm-scope-', 'node-modules/@') diff --git a/packages/webpack-uni-mp-loader/package.json b/packages/webpack-uni-mp-loader/package.json index dee0eecca..51488b3ea 100644 --- a/packages/webpack-uni-mp-loader/package.json +++ b/packages/webpack-uni-mp-loader/package.json @@ -1,6 +1,6 @@ { "name": "@dcloudio/webpack-uni-mp-loader", - "version": "1.0.0-alpha-22120190814002", + "version": "0.3.644", "description": "webpack-uni-mp-loader", "main": "index.js", "files": [ diff --git a/packages/webpack-uni-pages-loader/package.json b/packages/webpack-uni-pages-loader/package.json index 5a1abd49d..0675408df 100644 --- a/packages/webpack-uni-pages-loader/package.json +++ b/packages/webpack-uni-pages-loader/package.json @@ -1,6 +1,6 @@ { "name": "@dcloudio/webpack-uni-pages-loader", - "version": "0.2.873", + "version": "0.2.874", "description": "uni-app pages.json loader", "main": "lib/index.js", "files": [ @@ -16,7 +16,7 @@ "strip-json-comments": "^2.0.1" }, "uni-app": { - "compilerVersion": "2.2.1" + "compilerVersion": "2.2.3" }, "gitHead": "08ea04b669e93f0db3acb2dfa38138298edd5789" } -- GitLab