@areslabs/alita-core
Version:
alita-core
263 lines (221 loc) • 9.08 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = packByWebpack;
var _webpack = _interopRequireDefault(require("webpack"));
var path = _interopRequireWildcard(require("path"));
var _copyWebpackPlugin = _interopRequireDefault(require("copy-webpack-plugin"));
var _WatchModuleUpdatedPlugin = _interopRequireDefault(require("./WatchModuleUpdatedPlugin"));
var _ExtractImageFilesPlugin = _interopRequireDefault(require("./ExtractImageFilesPlugin"));
var _configure = _interopRequireDefault(require("../configure"));
var _miniprogramTarget = _interopRequireDefault(require("./miniprogramTarget"));
var _constants = require("../constants");
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
const defaultAlias = {
'react': '@areslabs/wx-react',
'react-native': '@areslabs/wx-react-native',
'prop-types': '@areslabs/wx-prop-types',
// 由于hoc的差异,hoc需要使用alita专用的
'mobx-react': "@areslabs/wx-mobx-react",
'react-redux': "@areslabs/wx-react-redux",
// 处于包大小的考虑,内置处理
'redux-promise': "@areslabs/wx-redux-promise"
};
const mainFields = ['weixin', 'browser', 'module', 'main'];
const extensions = ['.wx.js', '.wx.jsx', '.js', '.jsx', '.wx.ts', '.wx.tsx', '.ts', '.tsx', '.json'];
const MagicNumber = 1000000;
function packByWebpack() {
const mpComps = new Set(_constants.wxBaseComp);
const mpKeys = Object.keys(_configure.default.configObj.miniprogramComponents);
mpKeys.forEach(key => mpComps.add(key));
const alitaHandleRule = {
test: /\.[jt]sx?$/,
use: [{
loader: 'babel-loader',
options: {
plugins: ["@babel/plugin-transform-regenerator", ["@areslabs/babel-plugin-alitamisc", {
stringComps: mpComps
}]]
}
}, {
loader: path.resolve(__dirname, 'jsx-loader.js')
}, {
loader: path.resolve(__dirname, 'entry-loader.js')
}, {
loader: path.resolve(__dirname, 'base-loader.js')
}, {
loader: path.resolve(__dirname, 'precheck-loader.js')
}, {
loader: path.resolve(__dirname, 'gatherInfo-loader.js')
}]
};
const defaultRules = [alitaHandleRule];
const cco = _configure.default.configObj;
let resolve = null;
if (cco.resolve) {
resolve = _objectSpread({}, cco.resolve, {
alias: _objectSpread({}, defaultAlias, {}, cco.resolve.alias || {}),
extensions: [...extensions, ...(cco.resolve.extensions || [])],
mainFields: [...mainFields, ...(cco.resolve.mainFields || [])]
});
} else {
resolve = {
alias: defaultAlias,
extensions,
mainFields
};
}
if (cco.exclude) {
alitaHandleRule.exclude = cco.exclude;
}
if (cco.include) {
alitaHandleRule.include = cco.include;
} // default
if (!cco.include && !cco.exclude) {
alitaHandleRule.exclude = /node_modules/;
}
let module = null;
if (cco.module) {
module = _objectSpread({}, cco.module, {
rules: [...defaultRules, ...(cco.module.rules || [])]
});
} else {
module = {
rules: defaultRules
};
}
const plugins = [new _copyWebpackPlugin.default([{
from: path.resolve(__dirname, "..", "..", 'mptemp'),
to: _configure.default.outputFullpath
}]), new _webpack.default.DefinePlugin({
'process.env.NODE_ENV': _configure.default.dev ? '"development"' : '"production"',
'global': 'wx'
}), // react-native 全局可以使用的变量
new _webpack.default.ProvidePlugin({
fetch: ['react-native', 'fetch'],
alert: ['react-native', 'alert'],
requestAnimationFrame: ['react-native', 'requestAnimationFrame'],
cancelAnimationFrame: ['react-native', 'cancelAnimationFrame'],
"_ARR": "@areslabs/regenerator-runtime"
}), new _WatchModuleUpdatedPlugin.default(), new _ExtractImageFilesPlugin.default(), ...(cco.plugins || [])];
if (_configure.default.analyzer) {
plugins.push(new BundleAnalyzerPlugin());
}
const webpackConfigure = {
entry: {
"_rn_": cco.entry
},
context: _configure.default.inputFullpath,
output: {
path: path.resolve(cco.output),
filename: '[name].js'
},
mode: _configure.default.dev ? 'development' : 'production',
target: _miniprogramTarget.default,
optimization: {
usedExports: true,
splitChunks: {
chunks: 'async',
minSize: 1,
maxSize: 0,
minChunks: MagicNumber,
maxAsyncRequests: MagicNumber,
maxInitialRequests: MagicNumber,
automaticNameDelimiter: '~',
name: true,
cacheGroups: {
vendors: {
minChunks: MagicNumber,
test: /[\\/]node_modules[\\/]/,
priority: -10
},
default: {
minChunks: MagicNumber,
priority: -20,
reuseExistingChunk: true
}
}
}
},
//TODO
devtool: _configure.default.dev ? 'cheap-source-map' : "none",
plugins,
resolve,
module,
// 当alita使用的loader和项目中依赖冲突时,比如项目中有多个babel-loader, alita需要取到自己的那一个
resolveLoader: {
modules: [path.resolve('node_modules', '@areslabs', 'alita-core', 'node_modules'), 'node_modules']
}
};
_configure.default.resolve = webpackConfigure.resolve; // 把webpackConfigure 暴露出来, 方便其他地方获取此configure
// TODO 使用webpack的获取方式?
_configure.default.webpackConfigure = webpackConfigure;
const compiler = (0, _webpack.default)(webpackConfigure);
if (_configure.default.dev) {
compiler.watch({
aggregateTimeout: 300
}, watchCb);
} else {
compiler.run(runCb);
}
}
function runCb(err, stats) {
if (err) {
handleWebpackError(err);
return;
}
const info = stats.toJson();
if (stats.hasWarnings()) {
info.warnings.forEach(err => {
handleWarning(err);
});
}
if (stats.hasErrors()) {
info.errors.forEach(err => {
handleError(err);
});
} else {
console.log('\n编译完成'.info);
}
}
function watchCb(err, stats) {
if (err) {
handleWebpackError(err);
return;
}
const info = stats.toJson();
if (stats.hasWarnings()) {
info.warnings.forEach(err => {
handleWarning(err);
});
}
if (stats.hasErrors()) {
info.errors.forEach(err => {
handleError(err);
});
} else {
console.log(`\n编译完成, 监听文件...`.info);
}
}
function handleWebpackError(err) {
console.log(err.stack || err);
if (err.details) {
console.error(err.details);
}
}
function handleError(message) {
console.log(message.error); //const mess = message.split('\n')
//return console.log(`${mess[0]} ${mess[3]}\n${mess[4]}`.error)
}
function handleWarning(message) {
console.log(message.warning);
/*const mess = message.split('\n')
return console.log(`${mess[0]} ${mess[3]}\n${mess[4]}`.warning)*/
}