11var path = require ( 'path' )
22var fs = require ( 'fs' )
3+ var util = require ( 'util' )
4+ var resolve = require ( 'resolve' )
5+ var glob = require ( 'glob' )
36// const { NpmAutoInstallWebpackPlugin } = require('npm-auto-install-webpack-plugin')
47
58function saveEntryMain ( index , src , mpType ) {
@@ -22,34 +25,66 @@ export default {
2225 return fileSrc
2326}
2427
25- function searchEntry ( dir , config , entryName , mpType ) {
26- if ( ! fs . existsSync ( dir ) ) {
27- return
28+ function resolveEntry ( src , cwd ) {
29+ try {
30+ return resolve . sync ( src , { basedir : cwd } )
31+ } catch ( err ) {
32+ // console.log(err)
2833 }
34+ return ''
35+ }
2936
30- const files = fs . readdirSync ( dir )
31- if ( files . includes ( 'main.js' ) ) {
32- config . entry [ entryName || path . basename ( dir ) ] = path . resolve ( dir , 'main.js' )
33- return
37+ // 如果有 main.js 就不找 app.vue 了,免得混乱
38+ function searchEntry ( pattern , entryName , cwd , config ) {
39+ const entryFiles = glob . sync ( pattern , { cwd } )
40+ if ( ! entryFiles . length ) {
41+ return false
3442 }
3543
36- files . forEach ( ( k , i ) => {
37- const page = path . resolve ( dir , k )
38- if ( fs . existsSync ( page ) && searchFileFilter . some ( f => f . test ( page ) ) ) {
39- config . entry [ entryName || path . parse ( page ) . name ] = saveEntryMain ( i , page , mpType )
40- }
44+ if ( entryFiles . length === 1 ) {
45+ const realSrc = path . resolve ( cwd , entryFiles [ 0 ] )
46+ config . entry [ getEntryName ( realSrc , entryName ) ] = realSrc
47+ return true
48+ }
49+
50+ entryFiles . forEach ( ( k , i ) => {
51+ const src = path . resolve ( cwd , k )
52+ config . entry [ getEntryName ( src ) ] = src
4153 } )
54+
55+ return true
4256}
4357
58+ function getEntryName ( src , pageName ) {
59+ if ( pageName ) {
60+ return pageName
61+ }
62+ const { dir, name } = path . parse ( src )
63+ if ( [ 'app' , 'App' , 'main' , 'index' ] . includes ( name ) ) {
64+ return path . parse ( dir ) . name
65+ }
66+ return name
67+ }
68+
69+ // 暂时只想到这么做缓存
4470let argvOptions = null
45- let searchPath = [ './' , './src' , './src/pages' , './mpvue-pages' ]
46- let searchFileFilter = [ / .* ?\. v u e $ / , / m a i n \. j s / ]
4771function injectArgvOptions ( options ) {
4872 argvOptions = options
4973}
5074
75+ // 默认优先为完整路径的单文件
76+ // 其次是 glob 格式扫描到的文件
77+ // 其次是 node.js 本地运行时传递的 object
78+ // 再次是一个路径下,默认扫描
79+ // 最后才是默认路径,默认扫描
80+ // component 针对所有扫描到的 .vue SFC entry 才有用
81+ // 有且只有一个 entry 的时候 pageName 才有效
5182function mergeArgvConfig ( config ) {
5283 // 默认初始化
84+ const cwd = path . resolve ( )
85+ const defConfig = { entry : { } , resolve : { alias : { } } }
86+ const floders = [ './src/' , './mpvue-pages/' ]
87+ const searchFilters = [ './**/**/main.js' , './**/**/app.vue' , './**/**/App.vue' , './**/**/index.vue' ]
5388 config . argvConfig = {
5489 // plugins: [
5590 // new NpmAutoInstallWebpackPlugin()
@@ -59,42 +94,47 @@ function mergeArgvConfig (config) {
5994 // 拼接自定义的参数
6095 var argv = Object . assign ( { } , argvOptions , require ( 'yargs' ) . argv )
6196 const {
62- entry : argvEntry ,
63- output : argvOutput ,
64- config : argvCnf ,
65- pageName : argvPageName ,
66- searchPath : argvSearchPath ,
67- component : argvComponent ,
97+ entry : argvEntry , // ./src/main.js, ./src/app.vue, ./src/, ./src/**/main.js, { page: './page/main.js' }, undefined
98+ pageName : argvPageName , // nameStrng, undefined
99+ component : argvComponent , // true, undefined
100+ output : argvOutput , // pathString, undefined
101+ config : argvCnf , // pathString, undefined
68102 ...resetConfig
69103 } = argv
70- const defConfig = { entry : { } , resolve : { alias : { } } }
71104 const mpType = argvComponent ? 'component' : 'page'
72105
73- if ( typeof argvPageName === 'string' ) {
74- searchPath = searchPath . concat ( argvPageName . split ( ',' ) )
75- }
76-
106+ // 开始获取 entry
77107 if ( typeof argvEntry === 'string' ) {
78- const entryPath = path . resolve ( argvEntry )
79- if ( typeof argvPageName === 'string' ) {
80- const entryName = argvPageName || path . parse ( entryPath ) . name
81- defConfig . entry [ entryName ] = entryPath
82- } else if ( fs . existsSync ( entryPath ) ) {
83- defConfig . entry [ path . parse ( entryPath ) . name ] = entryPath
108+ // 首先判断是不是完整路径
109+ const curEntry = resolveEntry ( argvEntry , cwd )
110+ // const absEntry = path.resolve(argvEntry)
111+ if ( curEntry ) {
112+ defConfig . entry [ getEntryName ( curEntry , argvPageName ) ] = curEntry
84113 } else {
85- searchEntry ( entryPath , defConfig , argvPageName , mpType )
114+ // 先检查是否是 glob 格式的 filter
115+ // 再检查这是不是路径
116+ if ( ! searchEntry ( argvEntry , argvPageName , cwd , defConfig ) ) {
117+ floders . unpop ( )
118+ }
86119 }
120+ } else if ( util . isObject ( argvEntry ) ) {
121+ defConfig . entry = argvEntry
87122 } else {
88- searchPath . forEach ( s => {
89- searchEntry ( path . resolve ( s ) , defConfig , argvPageName , mpType )
123+ const allPattern = floders . reduce ( ( r , floder ) => {
124+ return r . concat ( searchFilters . map ( v => path . join ( floder , v ) ) )
125+ } , [ ] )
126+ allPattern . some ( pattern => {
127+ return searchEntry ( pattern , argvPageName , cwd , defConfig )
90128 } )
91129 }
92130
131+ // 输出文件夹
93132 if ( argvOutput ) {
94133 const assetsRoot = path . resolve ( argvOutput )
95134 defConfig . assetsRoot = assetsRoot
96135 }
97136
137+ // 合并自定义 webpack config
98138 if ( typeof argvCnf === 'string' ) {
99139 try {
100140 config . argvConfig = require ( 'webpack-merge' ) ( config . argvConfig , require ( path . resolve ( argvCnf ) ) )
@@ -104,6 +144,19 @@ function mergeArgvConfig (config) {
104144 Object . assign ( config . build , resetConfig , defConfig )
105145 Object . assign ( config . dev , resetConfig , defConfig )
106146
147+ const allEntry = Object . keys ( defConfig . entry )
148+
149+ if ( ! allEntry . length ) {
150+ throw Error ( 'At least one entry is needed: http://mpvue.com/mpvue/simple/' )
151+ }
152+
153+ // 处理 component 和 .vue 的 entry
154+ allEntry . forEach ( ( v , i ) => {
155+ if ( path . extname ( v ) === '.vue' ) {
156+ defConfig . entry [ v ] = saveEntryMain ( i , v , mpType )
157+ }
158+ } )
159+
107160 return config
108161}
109162
0 commit comments