UNPKG

@areslabs/alita-core

Version:

alita-core

263 lines (221 loc) 9.08 kB
"use strict"; 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)*/ }