提交 c265a947 编写于 作者: D DCloud_LXH

feat(mp): mp-weixin、mp-alipay 支持导出到插件

上级 5bdc3651
......@@ -25,12 +25,14 @@ module.exports = {
copyOptions.push('uni_modules/' + module + '/mycomponents')
})
if (process.env.UNI_MP_PLUGIN) {
copyOptions.push({
from: path.resolve(process.env.UNI_INPUT_DIR, 'plugin.json'),
transform: content => JSON.stringify(parseJson(content.toString(), true))
JSON.parse(process.env.UNI_MP_PLUGIN_EXPORT)
.concat(process.env.UNI_MP_PLUGIN ? 'plugin.json' : undefined)
.forEach(fileName => {
fileName && copyOptions.push({
from: path.resolve(process.env.UNI_INPUT_DIR, fileName),
transform: content => fileName === 'plugin.json' ? JSON.stringify(parseJson(content.toString(), true)) : content
})
})
}
return copyOptions
}
......
......@@ -32,12 +32,14 @@ module.exports = {
'functional-pages'
]
if (process.env.UNI_MP_PLUGIN) {
copyOptions.push({
from: path.resolve(process.env.UNI_INPUT_DIR, 'plugin.json'),
transform: content => JSON.stringify(parseJson(content.toString(), true))
JSON.parse(process.env.UNI_MP_PLUGIN_EXPORT)
.concat(process.env.UNI_MP_PLUGIN ? 'plugin.json' : undefined)
.forEach(fileName => {
fileName && copyOptions.push({
from: path.resolve(process.env.UNI_INPUT_DIR, fileName),
transform: content => fileName === 'plugin.json' ? JSON.stringify(parseJson(content.toString(), true)) : content
})
})
}
const workers = platformOptions.workers
workers && copyOptions.push(workers)
......
......@@ -49,6 +49,9 @@ process.env.UNI_USING_V3_SCOPED = true
process.env.UNI_CLOUD_PROVIDER = JSON.stringify([])
// 导出到小程序插件
process.env.UNI_MP_PLUGIN_EXPORT = JSON.stringify(Object.keys(platformOptions.plugins || {}).map(pluginName => platformOptions.plugins[pluginName].export))
const isH5 = !process.env.UNI_SUB_PLATFORM && process.env.UNI_PLATFORM === 'h5'
const isProduction = process.env.NODE_ENV === 'production'
......
......@@ -138,6 +138,10 @@ function initSubpackageConfig (webpackConfig, vueOptions) {
webpackConfig.output.jsonpFunction('webpackJsonp_' + (process.env.UNI_SUBPACKGE || process.env.UNI_MP_PLUGIN))
}
function addToUniEntry (fileName) {
fileName && (process.UNI_ENTRY[fileName.split('.')[0]] = path.resolve(process.env.UNI_INPUT_DIR, fileName))
}
module.exports = {
vueConfig: {
parallel: false
......@@ -171,18 +175,21 @@ module.exports = {
plugins.push(new PreprocessAssetsPlugin())
}
if (process.env.UNI_MP_PLUGIN) {
// 小程序插件入口使用
// packages\webpack-uni-mp-loader\lib\plugin\index-new.js -> addMPPluginRequire
beforeCode += `${process.env.UNI_PLATFORM === 'mp-alipay' ? 'my' : 'wx'}.__webpack_require_${process.env.UNI_MP_PLUGIN.replace(/-/g, '_')}__ = __webpack_require__;`
{
const globalEnv = process.env.UNI_PLATFORM === 'mp-alipay' ? 'my' : 'wx'
if (process.env.UNI_MP_PLUGIN) {
// 小程序插件入口使用
// packages\webpack-uni-mp-loader\lib\plugin\index-new.js -> addMPPluginRequire
addToUniEntry(process.env.UNI_MP_PLUGIN_MAIN)
const UNI_MP_PLUGIN_MAIN = process.env.UNI_MP_PLUGIN_MAIN
if (UNI_MP_PLUGIN_MAIN) {
process.UNI_ENTRY[UNI_MP_PLUGIN_MAIN.split('.')[0]] = path.resolve(process.env.UNI_INPUT_DIR,
UNI_MP_PLUGIN_MAIN)
beforeCode += `${globalEnv}.__webpack_require_${process.env.UNI_MP_PLUGIN.replace(/-/g, '_')}__ = __webpack_require__;`
} else {
beforeCode += `${globalEnv}.__webpack_require_UNI_MP_PLUGIN__ = __webpack_require__;`
}
}
JSON.parse(process.env.UNI_MP_PLUGIN_EXPORT).forEach(fileName => addToUniEntry(fileName))
const alias = { // 仅 mp-weixin
'mpvue-page-factory': require.resolve(
'@dcloudio/vue-cli-plugin-uni/packages/mpvue-page-factory')
......
......@@ -67,33 +67,33 @@ function addSubPackagesRequire (compilation) {
function addMPPluginRequire (compilation) {
// 编译到小程序插件 特殊处理入口文件
if (process.env.UNI_MP_PLUGIN) {
const assetsKeys = Object.keys(compilation.assets)
assetsKeys.forEach(name => {
if (name === process.env.UNI_MP_PLUGIN_MAIN) {
const modules = compilation.modules
const assetsKeys = Object.keys(compilation.assets)
const UNI_MP_PLUGIN_MAIN = process.env.UNI_MP_PLUGIN_MAIN
const UNI_MP_PLUGIN_EXPORT = JSON.parse(process.env.UNI_MP_PLUGIN_EXPORT)
assetsKeys.forEach(name => {
if ((name === UNI_MP_PLUGIN_MAIN && process.env.UNI_MP_PLUGIN) || UNI_MP_PLUGIN_EXPORT.includes(name)) {
const modules = compilation.modules
const mainFilePath = normalizePath(path.resolve(process.env.UNI_INPUT_DIR, process.env.UNI_MP_PLUGIN_MAIN))
const filePath = normalizePath(path.resolve(process.env.UNI_INPUT_DIR, name))
const uniModuleId = modules.find(module => module.resource && normalizePath(module.resource) === mainFilePath).id
const uniModuleId = modules.find(module => module.resource && normalizePath(module.resource) === filePath).id
const newlineIndex = compilation.assets[name].source().lastIndexOf('\n')
const newlineIndex = compilation.assets[name].source().lastIndexOf('\n')
const source = compilation.assets[name].source().substring(0, newlineIndex) +
`\nmodule.exports = ${process.env.UNI_PLATFORM === 'mp-alipay' ? 'my' : 'wx'}.__webpack_require_${process.env.UNI_MP_PLUGIN.replace(/-/g, '_')}__('${uniModuleId}');\n` +
compilation.assets[name].source().substring(newlineIndex + 1)
const source = compilation.assets[name].source().substring(0, newlineIndex) +
`\nmodule.exports = ${process.env.UNI_PLATFORM === 'mp-alipay' ? 'my' : 'wx'}.__webpack_require_${(process.env.UNI_MP_PLUGIN || 'UNI_MP_PLUGIN').replace(/-/g, '_')}__('${uniModuleId}');\n` +
compilation.assets[name].source().substring(newlineIndex + 1)
compilation.assets[name] = {
size () {
return Buffer.byteLength(source, 'utf8')
},
source () {
return source
}
compilation.assets[name] = {
size () {
return Buffer.byteLength(source, 'utf8')
},
source () {
return source
}
}
})
}
}
})
}
class WebpackUniMPPlugin {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册