UNPKG

@gdjiami/cli

Version:

CLI for build front end project.

276 lines (275 loc) 13.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); /** * 基础配置 */ var path_1 = tslib_1.__importDefault(require("path")); var webpack_1 = tslib_1.__importDefault(require("webpack")); var constants_1 = require("../constants"); var utils_1 = require("../utils"); var constants_2 = require("./constants"); var dev_config_1 = tslib_1.__importDefault(require("./dev.config")); var HtmlInjectedEnvironments_1 = tslib_1.__importDefault(require("./plugins/HtmlInjectedEnvironments")); var HtmlInterpolate_1 = tslib_1.__importDefault(require("./plugins/HtmlInterpolate")); var WatchMissingNodeModulesPlugin_1 = tslib_1.__importDefault(require("./plugins/WatchMissingNodeModulesPlugin")); var prod_config_1 = tslib_1.__importDefault(require("./prod.config")); var babelOptions_1 = tslib_1.__importDefault(require("./utils/babelOptions")); var cacheOptions_1 = tslib_1.__importDefault(require("./utils/cacheOptions")); var entry_1 = require("./utils/entry"); var eslintConfig_1 = tslib_1.__importDefault(require("./utils/eslintConfig")); var forkTsCheckerOption_1 = tslib_1.__importDefault(require("./utils/forkTsCheckerOption")); var styleLoaders_1 = tslib_1.__importDefault(require("./utils/styleLoaders")); var nodeExternals = require('webpack-node-externals'); var ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); var WebpackModules = require('webpack-modules'); var Es3ifyPlugin = require('es3ify-webpack-plugin'); var OfflinePlugin = require('offline-plugin'); var configure = function (enviroments, pkg, paths, argv) { var name = argv.name, entry = argv.entry; var isProduction = enviroments.raw.NODE_ENV === 'production'; var $ = function (development, production) { return (isProduction ? production : development); }; var envConfig = $(dev_config_1.default, prod_config_1.default)(enviroments, pkg, paths, argv); var context = paths.appSrc; var isElectron = argv.jmOptions.electron; var isIE8 = argv.jmOptions.ie8; var _a = entry_1.getEntries({ context: context, entry: entry, isProduction: isProduction, electron: isElectron, templateParameters: enviroments.raw, hotreload: !isIE8, inject: argv.jmOptions.inject, }), entries = _a.entries, templatePlugins = _a.templatePlugins; var filePrefix = name ? name + "_" : ''; var shouldUseSourceMap = enviroments.raw.SOURCE_MAP !== 'false'; entries = tslib_1.__assign(tslib_1.__assign({}, envConfig.entry), entries); utils_1.message.info("entries: " + Object.keys(entries).join(', ')); if (!argv.jmOptions.enableTypescriptCheck) { utils_1.message.info("Typescript check was disabled"); } var babelOptions = babelOptions_1.default(enviroments.raw, argv.jmOptions, paths); var babelLoders = [ // should I use cache-loader here? see more in https://github.com/webpack-contrib/cache-loader/issues/1#issuecomment-297994952 { loader: require.resolve('babel-loader'), options: babelOptions, }, ]; var webpackConfig = { name: name || (isElectron ? 'renderer' : ''), bail: envConfig.bail, context: context, mode: $('development', 'production'), devtool: envConfig.devtool, entry: entries, target: isElectron ? 'electron-renderer' : 'web', output: { filename: "static/js/" + filePrefix + "[name].js" + $('', '?[chunkhash:8]'), chunkFilename: "static/js/" + filePrefix + "[name].js" + $('', '?[chunkhash:8]'), path: paths.appDist, pathinfo: !isProduction, publicPath: enviroments.raw.PUBLIC_URL, // Point sourcemap entries to original disk location (format as URL on Windows) devtoolModuleFilenameTemplate: isProduction ? function (info) { return path_1.default.relative(paths.appSrc, info.absoluteResourcePath).replace(/\\/g, '/'); } : function (info) { return path_1.default.resolve(info.absoluteResourcePath).replace(/\\/g, '/'); }, libraryTarget: isElectron ? 'commonjs2' : undefined, }, externals: isElectron ? [ nodeExternals({ whitelist: constants_2.ExternalWhiteList, modulesFromFile: { include: ['dependencies'], }, }), ] : [argv.jmOptions.externals, require('webpack-require-http')], resolve: { modules: ['node_modules'], extensions: constants_1.Extensions, alias: tslib_1.__assign(tslib_1.__assign({}, (argv.jmOptions.alias || {})), { // 可以直接使用~访问相对于源代码目录的模块,优化查找效率 // 如 ~/components/Button '~': context }), }, resolveLoader: { modules: [paths.ownNodeModules, 'node_modules'], }, module: { strictExportPresence: true, rules: [ { parser: { requireEnsure: false } }, // eslint (!isProduction ? !!argv.jmOptions.enableESlint : !!argv.jmOptions.enableESlintInProduction) && { test: /\.(js|jsx|ts|tsx)$/, enforce: 'pre', use: [ { options: eslintConfig_1.default(paths), loader: require.resolve('eslint-loader'), }, ], include: paths.appSrc, }, { oneOf: tslib_1.__spreadArrays([ // typescript & js { test: /\.(ts|tsx|js|jsx)$/, oneOf: [ { test: /\.worker\.ts$/, use: [ { loader: require.resolve('worker-loader'), options: { inline: 'no-fallback' }, }, ], }, { exclude: { test: /node_modules/, exclude: /@gzbapp/, }, use: tslib_1.__spreadArrays([ { loader: require.resolve('cache-loader'), options: cacheOptions_1.default('babel-loader-render', enviroments.raw, paths), } ], babelLoders), }, ], }, { test: /\.css$/, exclude: { test: /node_modules\/@gdjiami\/rc-components/, }, use: tslib_1.__spreadArrays(styleLoaders_1.default(enviroments.raw, { cssOption: { importLoaders: 1, sourceMap: isProduction && shouldUseSourceMap, }, ie8: isIE8, }, undefined, undefined)), sideEffects: true, }, // pug loader { test: /\.pug$/, use: [ { loader: require.resolve('pug-loader'), options: { root: context, }, }, ], }, // svg 可以获取链接,也可以转换为React组件 { test: /\.svg$/, exclude: /fonts?/, issuer: { test: /\.(tsx|jsx|js|ts)$/, }, use: [ { loader: require.resolve('babel-loader'), options: babelOptions }, { loader: require.resolve('@svgr/webpack'), options: { icon: true, svgo: true, prettier: false, babel: false, svgProps: { fill: 'currentColor' }, expandProps: 'end', }, }, { loader: require.resolve('url-loader'), options: { limit: isIE8 ? false : 10000, name: "static/media/" + filePrefix + "[name].[ext]" + $('', '?[hash:8]'), }, }, ], }, // images { test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/, /\.svg$/], loader: require.resolve('url-loader'), options: { limit: isIE8 ? false : 10000, name: "static/media/" + filePrefix + "[name].[ext]" + $('', '?[hash:8]'), }, } ], ((envConfig.module && envConfig.module.rules) || []), [ { // Exclude `js` files to keep "css" loader working as it injects // its runtime that would otherwise be processed through "file" loader. // Also exclude `html` and `json` extensions so they get processed // by webpacks internal loaders. exclude: [/\.(ts|tsx|js|jsx|mjs)$/, /\.html$/, /\.json$/], loader: require.resolve('file-loader'), options: { name: "static/media/" + filePrefix + "[name].[ext]" + $('', '?[hash:8]'), }, }, ]), }, ].filter(Boolean), }, optimization: tslib_1.__assign({ concatenateModules: isIE8 ? true : undefined }, (envConfig.optimization || {})), plugins: tslib_1.__spreadArrays([ new WebpackModules(), isIE8 && new Es3ifyPlugin(), (isProduction ? argv.jmOptions.enableTypescriptCheckInProduction : argv.jmOptions.enableTypescriptCheck || utils_1.IS_CI) && // typescript type checker new ForkTsCheckerWebpackPlugin(forkTsCheckerOption_1.default(paths, enviroments.raw, argv.jmOptions, { watch: paths.appSrc, reportFiles: [ "**/*.@(ts|tsx)", !isProduction && "!" + path_1.default.basename(paths.appElectronMain) + "/**/*", '!**/__tests__/**', '!**/?(*.)(spec|test).*', ].filter(Boolean), })), // 移除moment语言包 new webpack_1.default.IgnorePlugin(/^\.\/locale$/, /moment$/), new webpack_1.default.DefinePlugin(enviroments.stringified), // 监听丢失的模块. 如果没有这个插件, 一旦没有找到对应的模块, 将需要重启webpack. // 在使用link 模块时比较有用 new WatchMissingNodeModulesPlugin_1.default(paths.appNodeModules) ], templatePlugins, [ // 注入环境变量到 window.JM_ENV中 new HtmlInjectedEnvironments_1.default(enviroments.userDefine, 'JM_ENV'), // 解析html里面的${ENV} new HtmlInterpolate_1.default(enviroments.raw) ], (envConfig.plugins || []), [ // 离线模式 !isIE8 && !isElectron && argv.jmOptions.offline && (!isProduction ? argv.jmOptions.enableOfflineInDev : true) && new OfflinePlugin(argv.jmOptions.offlineOptions), ]).filter(Boolean), node: isElectron ? false : { dgram: 'empty', fs: 'empty', net: 'empty', tls: 'empty', child_process: 'empty', }, performance: envConfig.performance, }; return webpackConfig; }; exports.default = configure;