04 Rdoc(react-doc) build – 01 webpack.config
const PATH = require('path');
const webpack = require('webpack');
const WebpackBar = require('webpackbar');
const UPATH = require('upath');
const paths = require('./path');
const pkg = require('../../package.json');
const define = { FOOTER: null };
if (paths.rdocConf && paths.rdocConf.footer && typeof paths.rdocConf.footer === 'string') {
define.FOOTER = JSON.stringify(paths.rdocConf.footer);
}
module.exports = {
entry: {},
output: {
path: paths.appBuildDist,
publicPath: paths.publicPath,
filename: 'js/[name].[hash:8].js',
chunkFilename: 'js/[name].[hash:8].js',
},
resolve: {
alias: {
'rdoc-theme': UPATH.normalizeSafe(paths.appThemePath),
},
},
module: {
rules: [
{
test: /\.(js|jsx|mjs)$/,
exclude: [/node_modules/, /\.(cache)/, /rdoc-theme-(.*)/],
enforce: 'pre',
use: [
// TODO:禁用require.ensure也不是一种标准的语言特征。
// 我们等待https://github.com/facebookincubator/create-react-app/issues/2176。
// { parser: { requireEnsure: false } },
{
// 首先运行linter。
// 在Babel处理js之前做这一点很重要。
options: {
eslintPath: require.resolve('eslint'),
configFile: require.resolve('../../.eslintrc.js'),
},
loader: require.resolve('eslint-loader'),
},
],
},
{
// “oneOf”将遍历所有以下加载程序,直到一个符合要求。
// 当没有加载器匹配时,它将返回到加载程序列表末尾的“file”加载器。
oneOf: [
{
test: /\.(svg|png|bmp|jpg|jpeg|gif)$/,
loader: require.resolve('url-replace-loader'),
options: {
limit: 10000,
name: 'img/[name].[hash:8].[ext]',
replace: [
{
test: /rdoc\.logo\.svg$/,
path: paths.logoPath,
},
],
},
},
{
test: /\.md$/,
use: [
{
loader: require.resolve('raw-content-replace-loader'),
options: {
path: PATH.join(paths.catchDirPath, './md'), // 需要替换的目录
replace: paths.projectPath, // 替换成目标目录
sep: /___/g, // 文件名存储,文件夹+下划线间隔+文件名
},
},
],
},
// “file-loader”确保这些资源由WebpackDevServer服务。
// 当您导入资源时,您将获得(虚拟)文件名。
// 在生产中,它们将被复制到`build`文件夹。
// 此加载程序不使用“test”,因此它将捕获所有模块
{
// 排除`js`文件以保持“css”加载器工作,因为它注入它的运行时,否则将通过“文件”加载器处理。
// 还可以排除“html”和“json”扩展名,以便它们被webpacks内部加载器处理。
exclude: [/\.js$/, /\.html$/, /\.json$/],
loader: require.resolve('file-loader'),
options: {
name: 'static/[name].[hash:8].[ext]',
},
},
],
},
],
},
plugins: [
new WebpackBar({ name: pkg.name }),
new webpack.DefinePlugin({
VERSION: JSON.stringify(pkg.version),
...define,
}),
],
node: {
dgram: 'empty',
fs: 'empty',
net: 'empty',
tls: 'empty',
child_process: 'empty',
},
};