Skip to content
This repository was archived by the owner on Jan 24, 2025. It is now read-only.

Commit 0284f52

Browse files
committed
chore(docz-core): a lot of bundler improvements
1 parent c935af5 commit 0284f52

File tree

17 files changed

+703
-621
lines changed

17 files changed

+703
-621
lines changed

core/docz-core/librc.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@ module.exports = {
2222
'react-dev-utils/formatWebpackMessages',
2323
'react-dev-utils/getCacheIdentifier',
2424
'react-dev-utils/ignoredFiles',
25+
'react-dev-utils/ModuleNotFoundPlugin',
26+
'react-dev-utils/typescriptFormatter',
2527
'react-dev-utils/WatchMissingNodeModulesPlugin',
26-
'react-dev-utils/WebpackDevServerUtils',
2728
'react-dom/server',
2829
]),
2930
}

core/docz-core/package.json

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,15 @@
2626
"@babel/runtime": "^7.2.0",
2727
"@mdx-js/loader": "^0.16.6",
2828
"@sindresorhus/slugify": "^0.6.0",
29+
"@svgr/webpack": "^4.1.0",
2930
"babel-loader": "^8.0.2",
3031
"babel-plugin-export-metadata": "^0.13.4",
32+
"babel-plugin-named-asset-import": "^0.3.0",
3133
"babel-preset-react-app": "^7.0.0",
32-
"babylon": "^6.18.0",
34+
"cache-loader": "^2.0.0",
3335
"chalk": "^2.4.1",
3436
"chokidar": "^2.0.4",
3537
"common-tags": "^1.8.0",
36-
"cpy": "^7.0.1",
3738
"deepmerge": "^3.0.0",
3839
"detect-port": "^1.3.0",
3940
"docz-utils": "^0.13.5",
@@ -53,7 +54,6 @@
5354
"lodash": "^4.17.11",
5455
"mini-html-webpack-plugin": "^0.2.3",
5556
"p-reduce": "^1.0.0",
56-
"progress-estimator": "^0.2.2",
5757
"react-dev-utils": "^7.0.0",
5858
"react-docgen": "^2.21.0",
5959
"react-docgen-actual-name-handler": "0.13.5",
@@ -69,7 +69,7 @@
6969
"resolve": "^1.9.0",
7070
"signale": "^1.3.0",
7171
"source-map-loader": "^0.2.4",
72-
"terser-webpack-plugin": "^1.2.0",
72+
"terser-webpack-plugin": "^1.2.1",
7373
"thread-loader": "^2.1.1",
7474
"titleize": "^1.0.1",
7575
"url-loader": "^1.1.2",
@@ -82,5 +82,18 @@
8282
"webpackbar": "^3.1.4",
8383
"ws": "^6.1.2",
8484
"yargs": "^12.0.5"
85+
},
86+
"devDependencies": {
87+
"@types/chokidar": "^1.7.5",
88+
"@types/express": "^4.16.0",
89+
"@types/html-minifier": "^3.5.2",
90+
"@types/p-reduce": "^1.0.0",
91+
"@types/resolve": "^0.0.8",
92+
"@types/webpack": "^4.4.22",
93+
"@types/webpack-chain": "^5.0.0",
94+
"@types/webpack-dev-server": "^3.1.1",
95+
"@types/ws": "^6.0.1",
96+
"@types/yargs": "^12.0.4",
97+
"cpy": "^7.0.1"
8598
}
8699
}

core/docz-core/src/bundler/config.ts

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,12 @@ import envDotProp from 'env-dot-prop'
66
import * as loaders from './loaders'
77
import * as plugins from './plugins'
88
import * as paths from '../config/paths'
9-
import { BabelRC } from '../config/babel'
109
import { minifier } from './minifier'
11-
import { ServerHooks } from '../lib/Bundler'
10+
import { ServerHooks as Hooks } from '../lib/Bundler'
1211
import { Config as Args, Env } from '../config/argv'
12+
import { getBabelConfig } from '../config/babel'
1313

14-
export const createConfig = (args: Args, env: Env) => async (
15-
babelrc: BabelRC,
16-
hooks: ServerHooks
17-
): Promise<Configuration> => {
14+
export const createConfig = (args: Args, env: Env) => async (hooks: Hooks) => {
1815
const { debug } = args
1916

2017
const config = new Config()
@@ -64,6 +61,9 @@ export const createConfig = (args: Args, env: Env) => async (
6461
.publicPath(publicPath)
6562
.when(isProd, outputProd, outputDev)
6663
.crossOriginLoading('anonymous')
64+
.devtoolModuleFilenameTemplate((info: any) =>
65+
path.resolve(info.resourcePath).replace(/\\/g, '/')
66+
)
6767

6868
/**
6969
* entries
@@ -90,21 +90,14 @@ export const createConfig = (args: Args, env: Env) => async (
9090
.add('.mdx')
9191
.end()
9292

93-
if (args.typescript) {
94-
config.resolve.extensions
95-
.prepend('.ts')
96-
.prepend('.tsx')
97-
.end()
98-
}
99-
10093
config.resolve.alias.set('~db', paths.db)
10194
config.resolve.alias.set('~imports', paths.importsJs)
10295
config.resolve.alias.set('react-native$', 'react-native-web')
10396

10497
const inYarnWorkspaces = __dirname.includes('/docz/core/docz-core')
10598
const doczDependenciesDir = inYarnWorkspaces
10699
? path.join(__dirname, '../../../../node_modules')
107-
: path.join(__dirname, '../../../')
100+
: paths.ownNodeModules
108101

109102
config.resolve.modules
110103
.add('node_modules')
@@ -129,18 +122,17 @@ export const createConfig = (args: Args, env: Env) => async (
129122
* loaders
130123
*/
131124

132-
config.when(args.sourcemaps, cfg => loaders.sourceMaps(cfg))
133-
loaders.js(config, args, babelrc)
134-
loaders.mdx(config, args, babelrc)
125+
const jsBabelRc = await getBabelConfig(args, env)
126+
const tsBabelRc = await getBabelConfig(args, env, true)
127+
128+
config.when(args.sourcemaps, cfg => loaders.sourceMaps(cfg, args))
129+
loaders.js(config, args, jsBabelRc)
130+
loaders.mdx(config, args, jsBabelRc)
135131
loaders.images(config)
136132
loaders.svg(config)
137133
loaders.media(config)
138134
loaders.fonts(config)
139135

140-
/**
141-
* plugins
142-
*/
143-
144136
await plugins.html(config, args, env)
145137
plugins.assets(config, args, env)
146138
plugins.ignore(config)
@@ -150,16 +142,28 @@ export const createConfig = (args: Args, env: Env) => async (
150142
config.when(debug, cfg => plugins.analyzer(cfg))
151143
config.when(!isProd, cfg => plugins.watchNodeModulesPlugin(cfg))
152144
config.when(!debug && !isProd, cfg => {
153-
plugins.webpackBar(cfg)
145+
plugins.webpackBar(cfg, args)
154146
plugins.friendlyErrors(cfg, args)
155147
})
156148

149+
/**
150+
* typescript setup
151+
*/
152+
153+
config.when(args.typescript, cfg => {
154+
cfg.resolve.extensions
155+
.prepend('.ts')
156+
.prepend('.tsx')
157+
.end()
158+
159+
loaders.ts(cfg, args, tsBabelRc)
160+
})
161+
157162
/**
158163
* optimization
159164
*/
160165

161166
config.optimization
162-
.runtimeChunk(true)
163167
.nodeEnv(env)
164168
.namedModules(true)
165169
.minimize(isProd)

core/docz-core/src/bundler/loaders.ts

Lines changed: 48 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,61 +9,87 @@ import * as paths from '../config/paths'
99
import { Config as Args } from '../config/argv'
1010
import { BabelRC } from '../config/babel'
1111

12-
const outsideNodeModules = (filepath: string) => !/node_modules/.test(filepath)
1312
const excludeNodeModules = (filepath: string) => /node_modules/.test(filepath)
1413

15-
export const sourceMaps = (config: Config) => {
14+
export const sourceMaps = (config: Config, args: Args) => {
15+
const srcPath = path.resolve(paths.root, args.src)
16+
1617
config.module
1718
.rule('sourcemaps')
1819
.test(/\.(js|mjs|jsx|ts|tsx|md|mdx)$/)
19-
.include.add(outsideNodeModules)
20+
.include.add(srcPath)
21+
.add(paths.app)
2022
.end()
2123
.use('sourcemaps')
2224
.loader(require.resolve('source-map-loader'))
2325
.end()
2426
.enforce('pre')
2527
}
2628

29+
const addScriptLoaders = (rule: Config.Rule, babelrc: BabelRC, args: Args) =>
30+
rule
31+
.when(!args.debug, rule =>
32+
rule
33+
.use('cache-loader')
34+
.loader(require.resolve('cache-loader'))
35+
.options({
36+
cacheDirectory: paths.cache,
37+
})
38+
)
39+
.use('thread-loader')
40+
.loader(require.resolve('thread-loader'))
41+
.options({
42+
workers: require('os').cpus().length - 1,
43+
})
44+
.end()
45+
.use('babel-loader')
46+
.loader(require.resolve('babel-loader'))
47+
.options(babelrc)
48+
.end()
49+
2750
export const js = (config: Config, args: Args, babelrc: BabelRC) => {
2851
const srcPath = path.resolve(paths.root, args.src)
29-
30-
config.module
52+
const rule = config.module
3153
.rule('js')
32-
.test(/\.(js|mjs|jsx|ts|tsx)$/)
54+
.test(/\.(js|mjs|jsx)$/)
3355
.include.add(srcPath)
34-
.add(paths.docz)
56+
.add(paths.root)
57+
.add(paths.app)
3558
.end()
3659
.exclude.add(excludeNodeModules)
3760
.end()
38-
.use('thread-loader')
39-
.loader(require.resolve('thread-loader'))
61+
62+
addScriptLoaders(rule, babelrc, args)
63+
}
64+
65+
export const ts = (config: Config, args: Args, babelrc: BabelRC) => {
66+
const srcPath = path.resolve(paths.root, args.src)
67+
const rule = config.module
68+
.rule('ts')
69+
.test(/\.(ts|tsx?)$/)
70+
.include.add(srcPath)
71+
.add(paths.root)
72+
.add(paths.app)
4073
.end()
41-
.use('babel-loader')
42-
.loader(require.resolve('babel-loader'))
43-
.options(babelrc)
74+
.exclude.add(excludeNodeModules)
4475
.end()
76+
77+
addScriptLoaders(rule, babelrc, args)
4578
}
4679

4780
export const mdx = (config: Config, args: Args, babelrc: BabelRC) => {
4881
const { mdPlugins, hastPlugins } = args
4982
const srcPath = path.resolve(paths.root, args.src)
50-
51-
config.module
83+
const rule = config.module
5284
.rule('mdx')
5385
.test(/\.(md|markdown|mdx)$/)
5486
.include.add(srcPath)
5587
.add(paths.root)
56-
.add(paths.docz)
5788
.end()
5889
.exclude.add(excludeNodeModules)
5990
.end()
60-
.use('thread-loader')
61-
.loader(require.resolve('thread-loader'))
62-
.end()
63-
.use('babel-loader')
64-
.loader(require.resolve('babel-loader'))
65-
.options(babelrc)
66-
.end()
91+
92+
addScriptLoaders(rule, babelrc, args)
6793
.use('mdx-loader')
6894
.loader(require.resolve('@mdx-js/loader'))
6995
.options({

core/docz-core/src/bundler/plugins.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { minify } from 'html-minifier'
66
import miniHtmlWebpack from 'mini-html-webpack-plugin'
77
import manifestPlugin from 'webpack-manifest-plugin'
88
import watchMissingNodeModules from 'react-dev-utils/WatchMissingNodeModulesPlugin'
9+
import moduleNotFoundPlugin from 'react-dev-utils/ModuleNotFoundPlugin'
910
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'
1011

1112
import * as paths from '../config/paths'
@@ -79,7 +80,11 @@ export const ignore = (config: Config) => {
7980
export const hot = (config: Config) => {
8081
config
8182
.plugin('hot-module-replacement')
82-
.use(HotModuleReplacementPlugin as any, [])
83+
.use(HotModuleReplacementPlugin as any, [
84+
{
85+
multiStep: true,
86+
},
87+
])
8388
}
8489

8590
export const html = async (config: Config, args: Args, env: Env) => {
@@ -114,12 +119,11 @@ export const html = async (config: Config, args: Args, env: Env) => {
114119
])
115120
}
116121

117-
export const webpackBar = (config: Config) => {
122+
export const webpackBar = (config: Config, args: Args) => {
118123
config.plugin('webpackbar').use(webpackBarPlugin, [
119124
{
125+
name: 'Docz',
120126
color: '#41b883',
121-
compiledIn: false,
122-
name: 'Client',
123127
},
124128
])
125129
}
@@ -129,3 +133,7 @@ export const watchNodeModulesPlugin = (config: Config) => {
129133
.plugin('watch-missing-node-modules')
130134
.use(watchMissingNodeModules, [paths.appNodeModules])
131135
}
136+
137+
export const notFoundPlugin = (config: Config) => {
138+
config.plugin('not-found-plugin').use(moduleNotFoundPlugin, [paths.root])
139+
}

core/docz-core/src/bundler/server.ts

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,34 @@
1-
import * as fs from 'fs'
1+
import chalk from 'chalk'
22
import logger from 'signale'
3-
import { Configuration as Config } from 'webpack'
43
import WebpackDevServer from 'webpack-dev-server'
4+
import { Configuration as Config } from 'webpack'
55

6-
import * as paths from '../config/paths'
76
import { devServerConfig } from './devserver'
87
import { Config as Args } from '../config/argv'
98
import { ServerHooks as Hooks } from '../lib/Bundler'
10-
import * as serverUtils from 'react-dev-utils/WebpackDevServerUtils'
11-
12-
export const server = (args: Args) => async (config: Config, hooks: Hooks) => {
13-
const useYarn = fs.existsSync(paths.appYarnLock)
14-
const protocol = process.env.HTTPS === 'true' ? 'https' : 'http'
15-
const appName = require(paths.appPackageJson).name
16-
const urls = serverUtils.prepareUrls(protocol, args.host, args.port)
17-
const serverConfig: any = devServerConfig(hooks, args)
189

19-
const compiler = serverUtils.createCompiler(
20-
require('webpack'),
21-
config,
22-
appName,
23-
urls,
24-
useYarn
25-
)
10+
const createCompiler = (config: Config) =>
11+
new Promise<any>(resolve => {
12+
try {
13+
resolve(require('webpack')(config))
14+
} catch (err) {
15+
logger.fatal(chalk.red('Failed to compile.'))
16+
logger.fatal()
17+
logger.fatal(err.message || err)
18+
logger.fatal()
19+
process.exit(1)
20+
}
21+
})
2622

27-
return {
28-
start: async () => {
29-
const devServer = new WebpackDevServer(compiler, serverConfig)
23+
export const server = (args: Args) => async (config: Config, hooks: Hooks) => ({
24+
start: async () => {
25+
const serverConfig: any = devServerConfig(hooks, args)
26+
const compiler = await createCompiler(config)
27+
const devServer = new WebpackDevServer(compiler, serverConfig)
3028

31-
return devServer.listen(args.port, args.host, err => {
32-
if (err) return logger.fatal(err)
33-
hooks.onServerListening<WebpackDevServer>(devServer)
34-
})
35-
},
36-
}
37-
}
29+
return devServer.listen(args.port, args.host, err => {
30+
if (err) return logger.fatal(err)
31+
hooks.onServerListening<WebpackDevServer>(devServer)
32+
})
33+
},
34+
})

core/docz-core/src/commands/build.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { parseConfig } from '../config/docz'
99
import { bundler as webpack } from '../bundler'
1010
import * as states from '../states'
1111

12-
export const build = async (args: Arguments) => {
12+
export const build = async (args: Arguments<any>) => {
1313
const env = envDotProp.get('node.env')
1414
const config = await parseConfig(args)
1515
const entries = new Entries(config)

0 commit comments

Comments
 (0)