@gdjiami/cli
Version:
CLI for build front end project.
276 lines (275 loc) • 13.8 kB
JavaScript
;
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;