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

feat(cli): tree-shaking with easycom

上级 4454da50
...@@ -330,17 +330,37 @@ const autoComponentMap = {} ...@@ -330,17 +330,37 @@ const autoComponentMap = {}
let lastUsingAutoImportComponentsJson = '' let lastUsingAutoImportComponentsJson = ''
process.UNI_AUTO_COMPONENTS = [] let uniAutoImportComponents = []
let uniAutoImportScanComponents = []
function initAutoImportScanComponents () {
const componentsPath = path.resolve(process.env.UNI_INPUT_DIR, 'components')
const components = {}
try {
fs.readdirSync(componentsPath).forEach(name => {
if (fs.existsSync(path.resolve(componentsPath, name, name + '.vue'))) {
components[`^${name}$`] = `@/components/${name}/${name}.vue`
} else if (fs.existsSync(path.resolve(componentsPath, name, name + '.nvue'))) {
components[`^${name}$`] = `@/components/${name}/${name}.nvue`
}
})
} catch (e) {}
uniAutoImportScanComponents = parseUsingAutoImportComponents(components)
refreshAutoComponentMap()
}
function initAutoImportComponents (usingAutoImportComponents = {}) { function initAutoImportComponents (usingAutoImportComponents = {}) {
// 目前仅 mp-weixin 内置支持 page-meta 等组件 // 目前仅 mp-weixin 内置支持 page-meta 等组件
if (process.env.UNI_PLATFORM !== 'mp-weixin') { if (process.env.UNI_PLATFORM !== 'mp-weixin') {
if (!usingAutoImportComponents['page-meta']) { if (!usingAutoImportComponents['^page-meta$']) {
usingAutoImportComponents['page-meta'] = usingAutoImportComponents['^page-meta$'] =
'@dcloudio/uni-cli-shared/components/page-meta.vue' '@dcloudio/uni-cli-shared/components/page-meta.vue'
} }
if (!usingAutoImportComponents['navigation-bar']) { if (!usingAutoImportComponents['^navigation-bar$']) {
usingAutoImportComponents['navigation-bar'] = usingAutoImportComponents['^navigation-bar$'] =
'@dcloudio/uni-cli-shared/components/navigation-bar.vue' '@dcloudio/uni-cli-shared/components/navigation-bar.vue'
} }
} }
...@@ -348,7 +368,7 @@ function initAutoImportComponents (usingAutoImportComponents = {}) { ...@@ -348,7 +368,7 @@ function initAutoImportComponents (usingAutoImportComponents = {}) {
const newUsingAutoImportComponentsJson = JSON.stringify(usingAutoImportComponents) const newUsingAutoImportComponentsJson = JSON.stringify(usingAutoImportComponents)
if (newUsingAutoImportComponentsJson !== lastUsingAutoImportComponentsJson) { if (newUsingAutoImportComponentsJson !== lastUsingAutoImportComponentsJson) {
lastUsingAutoImportComponentsJson = newUsingAutoImportComponentsJson lastUsingAutoImportComponentsJson = newUsingAutoImportComponentsJson
process.UNI_AUTO_COMPONENTS = parseUsingAutoImportComponents(usingAutoImportComponents) uniAutoImportComponents = parseUsingAutoImportComponents(usingAutoImportComponents)
refreshAutoComponentMap() refreshAutoComponentMap()
} }
} }
...@@ -363,8 +383,10 @@ function refreshAutoComponentMap () { ...@@ -363,8 +383,10 @@ function refreshAutoComponentMap () {
} }
function addAutoComponent (name) { function addAutoComponent (name) {
const options = process.UNI_AUTO_COMPONENTS let opt = uniAutoImportComponents.find(opt => opt.pattern.test(name))
const opt = options.find(opt => opt.pattern.test(name)) if (!opt) {
opt = uniAutoImportScanComponents.find(opt => opt.pattern.test(name))
}
if (!opt) { // 不匹配 if (!opt) { // 不匹配
return (autoComponentMap[name] = true) // cache return (autoComponentMap[name] = true) // cache
} }
...@@ -410,7 +432,8 @@ module.exports = { ...@@ -410,7 +432,8 @@ module.exports = {
parsePagesJson, parsePagesJson,
pagesJsonJsFileName, pagesJsonJsFileName,
getAutoComponents, getAutoComponents,
initAutoImportComponents, initAutoImportComponents,
initAutoImportScanComponents,
addPageUsingComponents, addPageUsingComponents,
getUsingComponentsCode, getUsingComponentsCode,
generateUsingComponentsCode, generateUsingComponentsCode,
......
...@@ -80,11 +80,10 @@ module.exports = (api, options) => { ...@@ -80,11 +80,10 @@ module.exports = (api, options) => {
webpackConfig.module webpackConfig.module
.rule('vue') .rule('vue')
.use('vue-loader') .use('vue-loader')
.loader(resolve('packages/vue-loader'))
.tap(options => Object.assign(options, { .tap(options => Object.assign(options, {
isH5TreeShaking: true,
cacheDirectory: false, cacheDirectory: false,
cacheIdentifier: false, cacheIdentifier: false
compilerOptions: require('@dcloudio/vue-cli-plugin-uni/lib/h5/compiler-options')
})) }))
.end() .end()
.uses .uses
......
...@@ -11,6 +11,8 @@ const { ...@@ -11,6 +11,8 @@ const {
getGlobalUsingComponentsCode getGlobalUsingComponentsCode
} = require('@dcloudio/uni-cli-shared/lib/pages') } = require('@dcloudio/uni-cli-shared/lib/pages')
const WebpackUniAppPlugin = require('../../packages/webpack-uni-app-loader/plugin/index')
const { const {
isUnaryTag, isUnaryTag,
getPartialIdentifier getPartialIdentifier
...@@ -36,7 +38,7 @@ function getProvides (isAppService) { ...@@ -36,7 +38,7 @@ function getProvides (isAppService) {
'getRegExp': [wxsPath, 'getRegExp'] 'getRegExp': [wxsPath, 'getRegExp']
} }
} }
return { // app-view return { // app-view
'__f__': [path.resolve(__dirname, '../format-log.js'), 'default'], '__f__': [path.resolve(__dirname, '../format-log.js'), 'default'],
'getDate': [wxsPath, 'getDate'], 'getDate': [wxsPath, 'getDate'],
'getRegExp': [wxsPath, 'getRegExp'] 'getRegExp': [wxsPath, 'getRegExp']
...@@ -172,6 +174,7 @@ const v3 = { ...@@ -172,6 +174,7 @@ const v3 = {
] ]
}, },
plugins: [ plugins: [
new WebpackUniAppPlugin(),
new webpack.ProvidePlugin(getProvides(isAppService)) new webpack.ProvidePlugin(getProvides(isAppService))
] ]
} }
...@@ -246,13 +249,13 @@ const v3 = { ...@@ -246,13 +249,13 @@ const v3 = {
compilerOptions compilerOptions
}, cacheConfig)) }, cacheConfig))
.end() .end()
// .use('uniapp-custom-block-loader') // .use('uniapp-custom-block-loader')
// .loader(require.resolve('@dcloudio/vue-cli-plugin-uni/packages/webpack-custom-block-loader')) // .loader(require.resolve('@dcloudio/vue-cli-plugin-uni/packages/webpack-custom-block-loader'))
// .options({ // .options({
// isAppService, // isAppService,
// isAppView, // isAppView,
// compiler: getPlatformCompiler() // compiler: getPlatformCompiler()
// }) // })
// 是否启用 cache // 是否启用 cache
if (process.env.UNI_USING_CACHE) { if (process.env.UNI_USING_CACHE) {
......
...@@ -312,9 +312,11 @@ if ( ...@@ -312,9 +312,11 @@ if (
} }
const { const {
initAutoImportComponents initAutoImportComponents,
initAutoImportScanComponents
} = require('@dcloudio/uni-cli-shared/lib/pages') } = require('@dcloudio/uni-cli-shared/lib/pages')
initAutoImportScanComponents()
initAutoImportComponents(pagesJsonObj.easycom) initAutoImportComponents(pagesJsonObj.easycom)
runByHBuilderX && console.log(`正在编译中...`) runByHBuilderX && console.log(`正在编译中...`)
......
...@@ -15,6 +15,8 @@ const modifyVueLoader = require('../vue-loader') ...@@ -15,6 +15,8 @@ const modifyVueLoader = require('../vue-loader')
const WebpackHtmlAppendPlugin = require('../../packages/webpack-html-append-plugin') const WebpackHtmlAppendPlugin = require('../../packages/webpack-html-append-plugin')
const WebpackUniAppPlugin = require('../../packages/webpack-uni-app-loader/plugin/index')
function resolve (dir) { function resolve (dir) {
return path.resolve(__dirname, '../../', dir) return path.resolve(__dirname, '../../', dir)
} }
...@@ -41,6 +43,7 @@ function getProvides () { ...@@ -41,6 +43,7 @@ function getProvides () {
} }
const plugins = [ const plugins = [
new WebpackUniAppPlugin(),
new webpack.ProvidePlugin(getProvides()) new webpack.ProvidePlugin(getProvides())
] ]
......
...@@ -8,6 +8,8 @@ const { ...@@ -8,6 +8,8 @@ const {
getPlatformCssnano getPlatformCssnano
} = require('@dcloudio/uni-cli-shared') } = require('@dcloudio/uni-cli-shared')
const WebpackUniAppPlugin = require('../packages/webpack-uni-app-loader/plugin/index')
const modifyVueLoader = require('./vue-loader') const modifyVueLoader = require('./vue-loader')
const { const {
...@@ -157,6 +159,7 @@ module.exports = { ...@@ -157,6 +159,7 @@ module.exports = {
}] }]
}, },
plugins: [ plugins: [
new WebpackUniAppPlugin(),
createUniMPPlugin(), createUniMPPlugin(),
new webpack.ProvidePlugin(getProvides()) new webpack.ProvidePlugin(getProvides())
] ]
......
...@@ -13,7 +13,7 @@ const componentNormalizerPath = require.resolve('./runtime/componentNormalizer') ...@@ -13,7 +13,7 @@ const componentNormalizerPath = require.resolve('./runtime/componentNormalizer')
const { NS } = require('./plugin') const { NS } = require('./plugin')
let errorEmitted = false let errorEmitted = false
let modules // h5 平台摇树优化时,需要保留编译器原始modules(因为框架内代码不需要modules,开发者代码需要)
function loadTemplateCompiler (loaderContext) { function loadTemplateCompiler (loaderContext) {
try { try {
return require('vue-template-compiler') return require('vue-template-compiler')
...@@ -75,6 +75,23 @@ module.exports = function (source) { ...@@ -75,6 +75,23 @@ module.exports = function (source) {
isAppNVue: options.isAppNVue isAppNVue: options.isAppNVue
}) })
if (options.isH5TreeShaking) { // 摇树优化逻辑(框架组件移除样式,禁用 modules)
const isWin = /^win/.test(process.platform)
const normalizePath = path => (isWin ? path.replace(/\\/g, '/') : path)
// fixed by xxxxxx
if(!modules && options.compilerOptions && options.compilerOptions.modules){
modules = options.compilerOptions.modules
}
const sourcePath = normalizePath(require('@dcloudio/uni-h5/path').src)
if (normalizePath(this.resourcePath).indexOf(sourcePath) === 0) {
descriptor.styles.length = 0
options.compilerOptions && (delete options.compilerOptions.modules)
} else if(options.compilerOptions){
options.compilerOptions.modules = modules
}
}
// if the query has a type field, this is a language block request // if the query has a type field, this is a language block request
// e.g. foo.vue?type=template&id=xxxxx // e.g. foo.vue?type=template&id=xxxxx
// and we will return early // and we will return early
......
const path = require('path')
const {
normalizePath
} = require('@dcloudio/uni-cli-shared')
const {
initAutoImportScanComponents
} = require('@dcloudio/uni-cli-shared/lib/pages')
class WebpackUniAppPlugin {
apply(compiler) {
compiler.hooks.invalid.tap('webpack-uni-app-invalid', (fileName, changeTime) => {
if (fileName && typeof fileName === 'string') {
if (fileName.indexOf('.vue') !== -1 || fileName.indexOf('.nvue') !== -1) {
initAutoImportScanComponents()
}
}
})
}
}
module.exports = WebpackUniAppPlugin
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册