nuke-debug-util
Version:
qap调试库函数
185 lines (178 loc) • 5.4 kB
JavaScript
;
/**
* 校验方法库
*/
const colors = require('chalk');
const glob = require('glob');
const path = require('path');
const cwd = process.cwd();
const srcPath = path.resolve(cwd, 'src');
const fs = require('fs-extra');
const ORIGIN_CONFIG = require('./schema/debug.default.js');
const util = require('./util');
/**
* 校验调试构建配置文件
* @return \{{{object}}\} {{配置对象}}{{}}
* 基本的构建配置webpack3已经做了校验,此处用于特殊校验及hack处理
* entry : src/pages/detail/index.jsx
*/
module.exports.debugConfig = function(configPath) {
var config = {};
try {
config = require(configPath);
} catch (error) {
config = {};
}
let webpackConfig = {};
if (config.toolkitConfig && config.toolkitConfig.webpack) {
webpackConfig = extendsConfig(
config.toolkitConfig.webpack,
ORIGIN_CONFIG.toolkitConfig.webpack
);
} else if (fs.existsSync(path.resolve(cwd, 'webpack.config.js'))) {
let oldConfig = require(path.resolve(cwd, 'webpack.config.js'));
oldConfig = oldConfig.dev ? oldConfig.dev() : oldConfig;
if (oldConfig.externals) {
oldConfig.externals = oldConfig.externals[0]
? oldConfig.externals[0]
: oldConfig.externals;
}
return {
success: true,
data: {
type: 'compat',
config: Object.assign(ORIGIN_CONFIG.toolkitConfig.webpack, {
hotreload: false,
externals: oldConfig.externals,
needH5SdkPack: oldConfig.externals ? true : false,
alias:
oldConfig.resolve && oldConfig.resolve.alias
? Object.assign(
{},
ORIGIN_CONFIG.toolkitConfig.webpack.alias,
oldConfig.resolve.alias
)
: {},
'optimize-size': {
nuke:
oldConfig.externals && oldConfig.externals.nuke ? false : true,
},
entry: oldConfig.entry,
output: oldConfig.output,
}),
},
};
} else {
console.log(
colors.red('[Config error]本地缺少webpack 1.x配置文件webpack.config.js')
);
process.exit(1);
}
// 存在hack字段则取webpack的自定义配置
if (webpackConfig.hack && webpackConfig.hack.webpackPath) {
let customWebpackConfig = {};
try {
customWebpackConfig = require(webpackConfig.hack.webpackPath);
console.log(
colors.yellow(
`[Config:warning]自定义webpack配置获取失败,将使用默认配置调试打包`
)
);
return {
success: true,
data: {
type: 'custom',
config: customWebpackConfig,
},
};
} catch (error) {
/**
* 取脚手架默认配置。
*/
return {
success: true,
data: {
type: 'default',
config: webpackConfig,
},
};
}
}
// 格式化默认入口 src/pages/aaaa/index.jsx
if (!webpackConfig.entry || util.isEmptyObject(webpackConfig.entry)) {
webpackConfig.entry = {};
glob
.sync('*', {
cwd: path.join(srcPath, 'pages'),
})
.forEach(function(page) {
webpackConfig.entry[page] = ['./pages/' + page + '/index'];
});
} else {
// 暂时不强制指定页面入口路径,只输出提示。
Object.keys(webpackConfig.entry).map(item => {
let reg = new RegExp(/pages\/\w.*\/index/);
if (!reg.test(webpackConfig.entry[item])) {
console.log(
colors.yellow(
`[Config:warning]${
webpackConfig.entry[item]
}不是建议的入口路径,入口路径规范需符合:`
),
colors.blue.underline('src/pages/xxx/index.js(x)')
);
}
});
}
//内置的优先级大于按需引用的优先级
Object.keys(webpackConfig.externals).map(pkg => {
webpackConfig.needH5SdkPack = true; // 是否需要h5版本的sdk-pack用于降级显示。
if (webpackConfig.externals[pkg]) {
if (webpackConfig['optimize-size'][pkg]) {
console.log(
colors.yellow(
`[Config:warning]内置${pkg}优先级大于按需引用,按需引用将无法生效`
)
);
webpackConfig['optimize-size'][pkg] = false;
}
webpackConfig.externals[pkg] = `commonjs ${pkg}`;
} else {
webpackConfig.needH5SdkPack = false;
}
});
// 输出路径
/**
* @todo 设置不开放
*/
// console.log(colors.green(webpackConfig.output));
// if (webpackConfig.output) {
// let reg = /^[a-z0-9]+$/i;
// if (!reg.test(webpackConfig.output)) {
// console.log(colors.red(`[Config:error]输出路径只能由英文字母或数字组成,不能包含其他特殊字符。采用默认output作为输出路径`));
// webpackConfig.output = 'output';
// }
// }
return {
success: true,
data: {
type: 'default',
config: webpackConfig,
},
};
};
/**
* 合并默认schema 如果源对象不存在的属性,则默认使用schema
* @param {*} targetObj schema配置
* @param {*} srcObj 源配置
*/
function extendsConfig(srcObj, targetObj) {
Object.keys(srcObj).map(function(attr) {
if (targetObj[attr]) {
if (targetObj[attr] !== {}) {
targetObj[attr] = srcObj[attr];
}
}
});
return targetObj;
}