roadhogx
Version:
Cli tool for serve and build react app, based on roadhog, support JSON pattern config, support more features
286 lines (242 loc) • 10.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.node = exports.defaultDevtool = exports.spriteSvgLoader = exports.baseSvgLoader = undefined;
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
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.getBabelOptions = getBabelOptions;
exports.getResolve = getResolve;
exports.getFirstRules = getFirstRules;
exports.getLastRules = getLastRules;
exports.getCSSRules = getCSSRules;
exports.getCommonPlugins = getCommonPlugins;
var _webpack = require('webpack');
var _webpack2 = _interopRequireDefault(_webpack);
var _autoprefixer = require('autoprefixer');
var _autoprefixer2 = _interopRequireDefault(_autoprefixer);
var _fs = require('fs');
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _extractTextWebpackPlugin = require('extract-text-webpack-plugin');
var _extractTextWebpackPlugin2 = _interopRequireDefault(_extractTextWebpackPlugin);
var _htmlWebpackPlugin = require('html-webpack-plugin');
var _htmlWebpackPlugin2 = _interopRequireDefault(_htmlWebpackPlugin);
var _copyWebpackPlugin = require('copy-webpack-plugin');
var _copyWebpackPlugin2 = _interopRequireDefault(_copyWebpackPlugin);
var _normalizeDefine = require('../utils/normalizeDefine');
var _normalizeDefine2 = _interopRequireDefault(_normalizeDefine);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
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; }
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); } } /**
* @Author: eason
* @Date: 2017-06-28T10:28:21+08:00
* @Email: uniquecolesmith@gmail.com
* @Last modified by: eason
* @Last modified time: 2017-07-15T16:45:11+08:00
* @License: MIT
* @Copyright: Eason(uniquecolesmith@gmail.com)
*/
function getBabelOptions(config) {
return {
babelrc: false,
presets: [require.resolve('babel-preset-es2015'), require.resolve('babel-preset-react'), require.resolve('babel-preset-react-optimize'), 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-transform-decorators-legacy')].concat(config.extraBabelPlugins || []),
cacheDirectory: true
};
}
var baseSvgLoader = exports.baseSvgLoader = {
test: /\.svg$/,
loader: 'file',
options: {
name: 'static/[name].[hash:8].[ext]'
}
};
var spriteSvgLoader = exports.spriteSvgLoader = {
test: /\.(svg)$/i,
loader: 'svg-sprite'
};
var defaultDevtool = exports.defaultDevtool = '#cheap-module-eval-source-map';
function getResolve(config, paths) {
return {
resolve: {
modules: [paths.ownNodeModules, paths.appNodeModules],
extensions: [].concat(_toConsumableArray(config.extraResolveExtensions || []), ['.web.js', '.web.jsx', '.web.ts', '.web.tsx', '.js', '.json', '.jsx', '.ts', '.tsx']),
alias: _extends({
'@': paths.appSrc, // eslint-disable-line
components: _path2.default.join(paths.appSrc, 'components'),
models: _path2.default.join(paths.appSrc, 'models'),
routes: _path2.default.join(paths.appSrc, 'routes'),
services: _path2.default.join(paths.appSrc, 'services'),
assets: _path2.default.join(paths.appSrc, 'assets'),
utils: _path2.default.join(paths.appSrc, 'utils')
}, Object.entries(config.alias || {}).reduce(function (t, _ref) {
var _ref2 = _slicedToArray(_ref, 2),
name = _ref2[0],
value = _ref2[1];
return Object.assign(t, _defineProperty({}, name, value));
}, {}))
},
resolveLoader: {
modules: [paths.ownNodeModules, paths.appNodeModules],
moduleExtensions: ['-loader']
}
};
}
function getFirstRules(_ref3) {
var paths = _ref3.paths,
babelOptions = _ref3.babelOptions,
config = _ref3.config;
return [{
exclude: [/\.html$/, /\.(js|jsx)$/, /\.(css|less|scss|sass)$/, /\.json$/, /\.svg$/, /\.tsx?$/],
loader: 'url',
options: {
limit: 10000,
name: 'static/[name].[hash:8].[ext]'
}
}, {
test: /\.(js|jsx)$/,
include: config && config.include && Array.isArray(config.include) ? [paths.appSrc].concat(_toConsumableArray(config.include.map(function (t) {
return paths.resolveApp(t);
}))) : paths.appSrc,
loader: 'babel',
options: babelOptions
}];
}
function getLastRules(_ref4) {
var paths = _ref4.paths,
babelOptions = _ref4.babelOptions;
return [
/*
{
test: /\.html$/,
loader: 'file',
options: {
name: '[name].[ext]',
},
},
*/
{
test: /\.tsx?$/,
include: paths.appSrc,
use: [{
loader: 'babel',
options: babelOptions
}, {
loader: 'awesome-typescript',
options: {
transpileOnly: true
}
}]
}];
}
function getCSSRules(env, _ref5) {
var paths = _ref5.paths,
cssLoaders = _ref5.cssLoaders,
theme = _ref5.theme,
config = _ref5.config;
var rules = [{
test: /\.css$/,
include: config && config.include && Array.isArray(config.include) ? [paths.appSrc].concat(_toConsumableArray(config.include.map(function (t) {
return paths.resolveApp(t);
}))) : paths.appSrc,
use: ['style'].concat(_toConsumableArray(cssLoaders.own))
}, {
test: /\.less$/,
include: paths.appSrc,
use: ['style'].concat(_toConsumableArray(cssLoaders.own), [{
loader: 'less',
options: {
modifyVars: theme
}
}])
}, {
test: /\.scss$/,
include: paths.appSrc,
use: ['style'].concat(_toConsumableArray(cssLoaders.own), [{
loader: 'sass'
}])
}, {
test: /\.css$/,
include: paths.appNodeModules,
use: ['style'].concat(_toConsumableArray(cssLoaders.nodeModules))
}, {
test: /\.less$/,
include: paths.appNodeModules,
use: ['style'].concat(_toConsumableArray(cssLoaders.nodeModules), [{
loader: 'less',
options: {
modifyVars: theme
}
}])
}, {
test: /\.scss$/,
include: paths.appNodeModules,
use: ['style'].concat(_toConsumableArray(cssLoaders.nodeModules), [{
loader: 'sass'
}])
}];
if (env === 'production') {
rules.forEach(function (rule) {
rule.use = _extractTextWebpackPlugin2.default.extract({
fallback: 'style',
use: rule.use.slice(1)
});
});
}
return rules;
}
var node = exports.node = {
fs: 'empty',
net: 'empty',
tls: 'empty'
};
function getCommonPlugins(_ref6) {
var config = _ref6.config,
paths = _ref6.paths,
appBuild = _ref6.appBuild,
NODE_ENV = _ref6.NODE_ENV;
var ret = [];
// ref: https://zhuanlan.zhihu.com/p/27980441
// ret.push(new webpack.optimize.ModuleConcatenationPlugin());
var defineObj = {
'process.env': {
NODE_ENV: JSON.stringify(NODE_ENV)
}
};
if (config.define) {
defineObj = _extends({}, defineObj, (0, _normalizeDefine2.default)(config.define));
}
ret.push(new _webpack2.default.DefinePlugin(defineObj));
if ((0, _fs.existsSync)(paths.appPublic)) {
ret.push(new _copyWebpackPlugin2.default([{
from: paths.appPublic,
to: appBuild
}]));
}
if (config.multipage) {
ret.push(new _webpack2.default.optimize.CommonsChunkPlugin({
name: 'vendor'
// filename: '[name].js',
}));
}
ret.push(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 : []))
}
}));
if (config.provide) {
ret.push(new _webpack2.default.ProvidePlugin(config.provide));
}
var htmlPath = _path2.default.join(paths.appPublic, config.html || 'index.html');
if ((0, _fs.existsSync)(htmlPath)) {
ret.push(new _htmlWebpackPlugin2.default({
template: htmlPath,
inject: true
}));
}
return ret;
}