UNPKG

@helldoc/core

Version:
104 lines (103 loc) 3.57 kB
"use strict"; exports.__esModule = true; var Config = require("webpack-chain"); var path_1 = require("path"); var util_1 = require("./util"); var alias_1 = require("../util/alias"); var contextPath = path_1.resolve(__dirname, "../../"); function default_1(ctx) { var isProd = process.env.NODE_ENV === "production"; var outDir = ctx.outDir; var config = new Config(); config.context(contextPath).mode(isProd ? "production" : "development"); config.output .path(outDir) .filename(isProd ? "assets/js/[chunkhash:8].js" : "assets/js/[name].js") .publicPath(ctx.base); if (!isProd) { config.devtool("cheap-module-eval-source-map"); } var modulePaths = util_1.getModulePaths(); config.resolve.symlinks(true); config.resolve.alias .set("#hell", alias_1.resolveApp("")) .set("@internal", ctx.tempPath) .set("@theme", ctx.themePath); config.resolve.extensions.merge([".js", ".jsx", ".md", ".scss"]); config.resolve.modules.merge(modulePaths); config.plugin("webpack-bar").use(require("webpackbar")); if (isProd) { config.plugin("extract-css").use(require("mini-css-extract-plugin"), [ { filename: "assets/css/styles.[chunkhash:8].css" } ]); /** * SplitChunks Suggest * From https://github.com/vuejs/vuepress/blob/master/packages/%40vuepress/core/lib/webpack/createBaseConfig.js#L267 */ config.optimization.splitChunks({ cacheGroups: { styles: { chunks: "all", enforce: true, name: "styles", // necessary to ensure async chunks are also extracted test: function (m) { return /css\/mini-extract/.test(m.type); } } } }); } var mdRule = config.module.rule("markdown").test(/\.md?$/); var babelRule = config.module.rule("babel").test(/\.js?$/); var babelOptions = { babelrc: false, cwd: contextPath, compact: false, cacheDirectory: true, plugins: [ ["@babel/plugin-proposal-class-properties", { loose: true }], "react-hot-loader/babel", "@babel/plugin-syntax-dynamic-import" ], presets: [ [ "@babel/preset-env", { targets: { browsers: "last 2 versions" } } // or whatever your project requires ], "@babel/preset-react" ] }; if (isProd) { babelOptions.plugins.push("@loadable/babel-plugin"); } [mdRule, babelRule].forEach(function (rule) { return rule .use("babel") .loader("babel-loader") .options(babelOptions) .end() .exclude.add(/node_modules/) .end(); }); // handle the markdown part mdRule .use("easy-markdown-loader") .loader(require.resolve("./markdownLoader")) .end(); var styleRule = config.module.rule("scss").test(/\.scss$/); if (isProd) { styleRule .use("extract-css-loader") .loader(require.resolve("mini-css-extract-plugin/dist/loader")); } else { styleRule.use("style-loader").loader("style-loader"); } styleRule.use("css-loader").loader("css-loader"); styleRule.use("sass-loader").loader("sass-loader"); return config; } exports["default"] = default_1;