UNPKG

silki

Version:

Cli tool for build react app, based on generator-react-multipage, create-react-app, roadhog. Support react multiple pages app develop.

245 lines (211 loc) 8.33 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; exports.default = function (args, appBuild, config, paths) { var debug = args.debug, analyze = args.analyze; var NODE_ENV = debug ? 'development' : process.env.NODE_ENV; var publicPath = config.publicPath; var cssLoaders = (0, _getCSSLoaders2.default)(config); var theme = (0, _getTheme2.default)(process.cwd(), config); // 获取多页面的所有入口,每个入口文件名都为 index.js var configEntry = config.entry ? paths.appDirectory + '/' + config.entry : paths.appSrc + '/pages/*/index.js'; var entries = (0, _entry2.default)(configEntry, config); // 添加mock数据入口 if (_fs2.default.existsSync(paths.appSrc + '/mock/mock.js')) { entries['mock'] = [paths.appSrc + '/mock/mock.js']; } return { bail: true, entry: entries, output: { path: appBuild, filename: '[name].js', publicPath: publicPath, chunkFilename: '[name].[chunkhash:8].chunk.js' }, resolve: { extensions: ['.web.js', '.web.jsx', '.web.ts', '.web.tsx', '.js', '.json', '.jsx', '.ts', 'tsx'], alias: { components: paths.appSrc + '/components/', containers: paths.appSrc + '/containers/', utils: paths.appSrc + '/utils/', mods: paths.appSrc + '/mods/', images: paths.appSrc + '/images/', 'react/lib/ReactMount': 'react-dom/lib/ReactMount' } }, resolveLoader: { modules: [paths.ownNodeModules, paths.appNodeModules] }, module: { rules: [{ exclude: [/\.html$/, /\.(js|jsx)$/, /\.(css|less|sass|scss|styl)$/, /\.json$/, /\.(mp4|ogg|svg)$/], use: { loader: 'url-loader', options: { limit: 10000, name: 'static/[name].[ext]', publicPath: publicPath } } }, { test: /\.(js|jsx)$/, include: paths.appSrc, use: { loader: 'babel-loader', options: config.useBabelrc ? {} : { babelrc: false, presets: [require.resolve('babel-preset-env'), require.resolve('babel-preset-react'), require.resolve('babel-preset-stage-0')].concat(config.extraBabelPresets || []), plugins: [require.resolve('babel-plugin-add-module-exports'), require.resolve('babel-plugin-react-require'), require.resolve('babel-plugin-syntax-dynamic-import')].concat(config.extraBabelPlugins || []), cacheDirectory: true } } }, { test: /\.css$/, include: paths.appSrc, use: _extractTextWebpackPlugin2.default.extract({ fallback: 'style-loader', use: cssLoaders.own }) }, { test: /\.css$/, include: paths.appNodeModules, use: _extractTextWebpackPlugin2.default.extract({ fallback: 'style-loader', use: cssLoaders.nodeModules }) }, { test: /\.less$/, include: paths.appSrc, use: _extractTextWebpackPlugin2.default.extract({ fallback: "style-loader", use: [].concat(_toConsumableArray(cssLoaders.own), [{ loader: 'less-loader', options: { modifyVars: theme } }]) }) }, { test: /\.less$/, include: paths.appNodeModules, use: _extractTextWebpackPlugin2.default.extract({ fallback: "style-loader", use: [].concat(_toConsumableArray(cssLoaders.nodeModules), [{ loader: 'less-loader', options: { modifyVars: theme } }]) }) }, { test: /\.scss/, include: paths.appSrc, use: _extractTextWebpackPlugin2.default.extract({ fallback: 'style-loader', use: [].concat(_toConsumableArray(cssLoaders.own), [{ loader: 'sass-loader', options: config.sassOptions }]) }) }, { test: /\.scss/, include: paths.appNodeModules, use: _extractTextWebpackPlugin2.default.extract({ fallback: 'style-loader', use: [].concat(_toConsumableArray(cssLoaders.nodeModules), [{ loader: 'sass-loader', options: config.sassOptions }]) }) }, { test: /\.(mp4|ogg|svg)$/, use: { loader: 'file-loader', options: { name: 'static/[name].[ext]', publicPath: publicPath } } }] }, plugins: [new _webpack2.default.DefinePlugin(_extends({ 'process.env': { NODE_ENV: JSON.stringify(NODE_ENV) } }, !config.define ? {} : (0, _normalizeDefine2.default)(config.define))), new _webpack2.default.ProvidePlugin({ jQuery: 'jquery', React: 'react', ReactDOM: 'react-dom' }), new _webpack2.default.LoaderOptionsPlugin({ options: { context: __dirname, postcss: [(0, _autoprefixer2.default)(config.autoprefixer || { browsers: ['>1%', 'last 4 versions', 'Firefox ESR', 'not ie < 9'] })].concat(_toConsumableArray(config.extraPostCSSPlugins ? config.extraPostCSSPlugins : [])) } }), new _extractTextWebpackPlugin2.default({ filename: '[name].css', allChunks: true })].concat(debug ? [] : new _webpackParallelUglifyPlugin2.default({ cacheDir: '.cache/', // 设置 cache 地址,加速压缩 uglifyJS: { compress: { screw_ie8: true, // React doesn't support IE8 warnings: false }, mangle: { screw_ie8: true }, output: { comments: false, screw_ie8: true } } })).concat(analyze ? new _webpackVisualizerPlugin2.default() : []).concat(!_fs2.default.existsSync(paths.appPublic) ? [] : new _copyWebpackPlugin2.default([{ from: paths.appPublic, to: paths.appBuild }])).concat(!config.multipage || config.noVendor ? [] : // 或配置了 noVendor new _webpack2.default.optimize.CommonsChunkPlugin({ name: 'vendor', filename: 'vendor.js', minChunks: Infinity })).concat((0, _html2.default)(entries)), externals: config.externals || '', node: { fs: 'empty', net: 'empty', tls: 'empty' } }; }; var _autoprefixer = require('autoprefixer'); var _autoprefixer2 = _interopRequireDefault(_autoprefixer); var _copyWebpackPlugin = require('copy-webpack-plugin'); var _copyWebpackPlugin2 = _interopRequireDefault(_copyWebpackPlugin); var _webpack = require('webpack'); var _webpack2 = _interopRequireDefault(_webpack); var _fs = require('fs'); var _fs2 = _interopRequireDefault(_fs); var _extractTextWebpackPlugin = require('extract-text-webpack-plugin'); var _extractTextWebpackPlugin2 = _interopRequireDefault(_extractTextWebpackPlugin); var _webpackVisualizerPlugin = require('webpack-visualizer-plugin'); var _webpackVisualizerPlugin2 = _interopRequireDefault(_webpackVisualizerPlugin); var _getTheme = require('../utils/getTheme'); var _getTheme2 = _interopRequireDefault(_getTheme); var _getCSSLoaders = require('../utils/getCSSLoaders'); var _getCSSLoaders2 = _interopRequireDefault(_getCSSLoaders); var _normalizeDefine = require('../utils/normalizeDefine'); var _normalizeDefine2 = _interopRequireDefault(_normalizeDefine); var _entry = require('../utils/entry'); var _entry2 = _interopRequireDefault(_entry); var _html = require('../utils/html'); var _html2 = _interopRequireDefault(_html); var _webpackParallelUglifyPlugin = require('webpack-parallel-uglify-plugin'); var _webpackParallelUglifyPlugin2 = _interopRequireDefault(_webpackParallelUglifyPlugin); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } module.exports = exports['default'];