11var path = require ( 'path' )
22var fs = require ( 'fs' )
3+ var util = require ( 'util' )
34var resolve = require ( 'resolve' )
45var glob = require ( 'glob' )
6+ var webpack = require ( 'webpack' )
57// const { NpmAutoInstallWebpackPlugin } = require('npm-auto-install-webpack-plugin')
68
79function saveEntryMain ( index , src , mpType ) {
@@ -24,97 +26,135 @@ export default {
2426 return fileSrc
2527}
2628
27- // 如果有 main.js 就不找 app.vue 了,免得混乱
28- function searchEntry ( dir , config , entryName , mpType ) {
29- let entryFiles = [ ]
30- searchFilters . some ( filter => {
31- entryFiles = glob . sync ( filter , { cwd : dir } )
32- return entryFiles . length
33- } )
29+ function resolveEntry ( src , cwd ) {
30+ try {
31+ return resolve . sync ( src , { basedir : cwd } )
32+ } catch ( err ) {
33+ // console.log(err)
34+ }
35+ return ''
36+ }
3437
35- if ( ! entryFiles || ! entryFiles . length ) {
36- return
38+ // 如果有 main.js 就不找 app.vue 了,免得混乱
39+ function searchEntry ( pattern , entryName , cwd , config ) {
40+ const entryFiles = glob . sync ( pattern , { cwd } )
41+ if ( ! entryFiles . length ) {
42+ return false
3743 }
3844
3945 if ( entryFiles . length === 1 ) {
40- config . entry [ entryName || path . basename ( dir ) ] = path . resolve ( dir , entryFiles [ 0 ] )
41- return
46+ const realSrc = path . resolve ( cwd , entryFiles [ 0 ] )
47+ config . entry [ getEntryName ( realSrc , entryName ) ] = realSrc
48+ return true
4249 }
4350
4451 entryFiles . forEach ( ( k , i ) => {
45- const src = path . resolve ( dir , k )
46- const entryPath = path . extname ( src ) === '.vue' ? saveEntryMain ( 0 , src , mpType ) : src
47- config . entry [ path . basename ( dir ) ] = entryPath
52+ const src = path . resolve ( cwd , k )
53+ config . entry [ getEntryName ( src ) ] = src
4854 } )
55+
56+ return true
4957}
5058
51- let argvOptions = null
52- let searchPath = [ './' , './src' , './src/pages' , './mpvue-pages' ]
53- let searchFilters = [ '**/**/main.js' , '**/**/app.vue' , '**/**/App.vue' , '**/**/index.vue' ]
59+ function getEntryName ( src , pageName ) {
60+ if ( pageName ) {
61+ return pageName
62+ }
63+ const { dir, name } = path . parse ( src )
64+ if ( [ 'app' , 'App' , 'main' , 'index' ] . includes ( name ) ) {
65+ return path . parse ( dir ) . name
66+ }
67+ return name
68+ }
5469
70+ // 暂时只想到这么做缓存
71+ let argvOptions = null
5572function injectArgvOptions ( options ) {
5673 argvOptions = options
5774}
5875
76+ // 默认优先为完整路径的单文件
77+ // 其次是 glob 格式扫描到的文件
78+ // 其次是 node.js 本地运行时传递的 object
79+ // 再次是一个路径下,默认扫描
80+ // 最后才是默认路径,默认扫描
81+ // component 针对所有扫描到的 .vue SFC entry 才有用
82+ // 有且只有一个 entry 的时候 pageName 才有效
5983function mergeArgvConfig ( config ) {
6084 // 默认初始化
85+ const cwd = path . resolve ( )
86+ const defConfig = { entry : { } , resolve : { alias : { } } }
87+ const floders = [ './src/' , './mpvue-pages/' ]
88+ const searchFilters = [ './**/**/main.js' , './**/**/app.vue' , './**/**/App.vue' , './**/**/index.vue' ]
6189 config . argvConfig = {
62- // plugins: [
63- // new NpmAutoInstallWebpackPlugin()
64- // ]
90+ plugins : [
91+ // new NpmAutoInstallWebpackPlugin()
92+ ]
6593 }
6694
6795 // 拼接自定义的参数
6896 var argv = Object . assign ( { } , argvOptions , require ( 'yargs' ) . argv )
6997 const {
70- entry : argvEntry , // ./src/main.js, ./src/app.vue, undefined
71- output : argvOutput , // pathString, undefined
98+ entry : argvEntry , // ./src/main.js, ./src/app.vue, ./src/, ./src/**/main.js, { page: './page/main.js' }, undefined
7299 pageName : argvPageName , // nameStrng, undefined
73100 component : argvComponent , // true, undefined
74- searchPath : argvSearchPath , // pathString, undefined
101+ output : argvOutput , // pathString, undefined
75102 config : argvCnf , // pathString, undefined
76- searchFilters : argvSearchFilters ,
103+ definePlugin : argvDefinePlugin , // object, undefined
77104 ...resetConfig
78105 } = argv
79- const defConfig = { entry : { } , resolve : { alias : { } } }
80106 const mpType = argvComponent ? 'component' : 'page'
81107
82- if ( typeof argvPageName === 'string' ) {
83- searchPath = searchPath . concat ( argvPageName . split ( ',' ) )
84- }
85-
86- if ( typeof argvSearchFilters === 'string' ) {
87- searchFilters = argvSearchFilters , split ( ',' )
88- }
89-
90- // 为什么这里面的逻辑这么凌乱呢?
91- // 可能是因为还没思考清楚吧
108+ // 开始获取 entry
92109 if ( typeof argvEntry === 'string' ) {
93- let entryPath = resolve . sync ( argvEntry , { basedir : path . resolve ( ) , extensions : [ '.js' , '.vue' ] } )
94-
95- if ( path . extname ( entryPath ) === '.vue' ) {
96- entryPath = saveEntryMain ( 0 , entryPath , mpType )
97- }
98-
99- if ( typeof argvPageName === 'string' ) {
100- const entryName = argvPageName || path . parse ( entryPath ) . name
101- defConfig . entry [ entryName ] = entryPath
102- } else if ( fs . existsSync ( entryPath ) ) {
103- defConfig . entry [ path . parse ( entryPath ) . name ] = entryPath
110+ // 首先判断是不是完整路径
111+ const curEntry = resolveEntry ( argvEntry , cwd )
112+ // const absEntry = path.resolve(argvEntry)
113+ if ( curEntry ) {
114+ defConfig . entry [ getEntryName ( curEntry , argvPageName ) ] = curEntry
104115 } else {
105- searchEntry ( entryPath , defConfig , argvPageName , mpType )
116+ // 先检查是否是 glob 格式的 filter
117+ // 再检查这是不是路径
118+ if ( ! searchEntry ( argvEntry , argvPageName , cwd , defConfig ) ) {
119+ floders . unpop ( )
120+ }
106121 }
122+ } else if ( util . isObject ( argvEntry ) ) {
123+ defConfig . entry = argvEntry
107124 } else {
108- searchPath . forEach ( s => {
109- searchEntry ( path . resolve ( s ) , defConfig , argvPageName , mpType )
125+ const allPattern = floders . reduce ( ( r , floder ) => {
126+ return r . concat ( searchFilters . map ( v => path . join ( floder , v ) ) )
127+ } , [ ] )
128+ allPattern . some ( pattern => {
129+ return searchEntry ( pattern , argvPageName , cwd , defConfig )
110130 } )
111131 }
112132
133+ // 输出文件夹
113134 if ( argvOutput ) {
114135 const assetsRoot = path . resolve ( argvOutput )
115136 defConfig . assetsRoot = assetsRoot
116137 }
117138
139+ const allEntry = Object . keys ( defConfig . entry )
140+
141+ if ( ! allEntry . length ) {
142+ throw Error ( 'At least one entry is needed: http://mpvue.com/mpvue/simple/' )
143+ }
144+
145+ // 处理 component 和 .vue 的 entry
146+ allEntry . forEach ( ( v , i ) => {
147+ if ( path . extname ( v ) === '.vue' ) {
148+ defConfig . entry [ v ] = saveEntryMain ( i , v , mpType )
149+ }
150+ } )
151+
152+ // DefinePlugin
153+ if ( argvDefinePlugin ) {
154+ config . argvConfig . plugins . push ( new webpack . DefinePlugin ( argvDefinePlugin ) )
155+ }
156+
157+ // 合并自定义 webpack config
118158 if ( typeof argvCnf === 'string' ) {
119159 try {
120160 config . argvConfig = require ( 'webpack-merge' ) ( config . argvConfig , require ( path . resolve ( argvCnf ) ) )
@@ -124,12 +164,6 @@ function mergeArgvConfig (config) {
124164 Object . assign ( config . build , resetConfig , defConfig )
125165 Object . assign ( config . dev , resetConfig , defConfig )
126166
127- console . log ( defConfig )
128-
129- if ( ! Object . keys ( defConfig . entry ) . length ) {
130- throw Error ( 'At least one entry is needed: http://mpvue.com/mpvue/simple/' )
131- }
132-
133167 return config
134168}
135169
0 commit comments