atool-build
Version:
Build tool based on webpack
237 lines (185 loc) • 9.15 kB
JavaScript
;
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; };
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
exports.default = getWebpackCommonConfig;
var _webpack = require('webpack');
var _webpack2 = _interopRequireDefault(_webpack);
var _extractTextWebpackPlugin = require('extract-text-webpack-plugin');
var _extractTextWebpackPlugin2 = _interopRequireDefault(_extractTextWebpackPlugin);
var _caseSensitivePathsWebpackPlugin = require('case-sensitive-paths-webpack-plugin');
var _caseSensitivePathsWebpackPlugin2 = _interopRequireDefault(_caseSensitivePathsWebpackPlugin);
var _fs = require('fs');
var _path = require('path');
var _rucksackCss = require('rucksack-css');
var _rucksackCss2 = _interopRequireDefault(_rucksackCss);
var _autoprefixer = require('autoprefixer');
var _autoprefixer2 = _interopRequireDefault(_autoprefixer);
var _friendlyErrorsWebpackPlugin = require('friendly-errors-webpack-plugin');
var _friendlyErrorsWebpackPlugin2 = _interopRequireDefault(_friendlyErrorsWebpackPlugin);
var _nodeNotifier = require('node-notifier');
var _nodeNotifier2 = _interopRequireDefault(_nodeNotifier);
var _buildStatisticsWebpackPlugin = require('build-statistics-webpack-plugin');
var _buildStatisticsWebpackPlugin2 = _interopRequireDefault(_buildStatisticsWebpackPlugin);
var _bigbrotherWebpackPlugin = require('bigbrother-webpack-plugin');
var _bigbrotherWebpackPlugin2 = _interopRequireDefault(_bigbrotherWebpackPlugin);
var _getBabelCommonConfig = require('./getBabelCommonConfig');
var _getBabelCommonConfig2 = _interopRequireDefault(_getBabelCommonConfig);
var _getTSCommonConfig = require('./getTSCommonConfig');
var _getTSCommonConfig2 = _interopRequireDefault(_getTSCommonConfig);
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; }
/* eslint quotes:0 */
function getWebpackCommonConfig(args) {
var pkgPath = (0, _path.join)(args.cwd, 'package.json');
var pkg = (0, _fs.existsSync)(pkgPath) ? require(pkgPath) : {};
var atoolBuildPkg = require((0, _path.join)(__dirname, '../package.json'));
var jsFileName = args.hash ? '[name]-[chunkhash].js' : '[name].js';
var cssFileName = args.hash ? '[name]-[chunkhash].css' : '[name].css';
var commonName = args.hash ? 'common-[chunkhash].js' : 'common.js';
var silent = args.silent === true;
var babelQuery = (0, _getBabelCommonConfig2.default)();
var tsQuery = (0, _getTSCommonConfig2.default)();
tsQuery.declaration = false;
var theme = {};
if (pkg.theme && typeof pkg.theme === 'string') {
var cfgPath = pkg.theme;
// relative path
if (cfgPath.charAt(0) === '.') {
cfgPath = (0, _path.resolve)(args.cwd, cfgPath);
}
var getThemeConfig = require(cfgPath);
theme = getThemeConfig();
} else if (pkg.theme && _typeof(pkg.theme) === 'object') {
theme = pkg.theme;
}
var emptyBuildins = ['child_process', 'cluster', 'dgram', 'dns', 'fs', 'module', 'net', 'readline', 'repl', 'tls'];
var browser = pkg.browser || {};
var node = emptyBuildins.reduce(function (obj, name) {
if (!(name in browser)) {
return _extends({}, obj, _defineProperty({}, name, 'empty'));
}
return obj;
}, {});
// 时间分析产物文件地址
var stagesPath = (0, _path.join)(__dirname, '../run/build-statistics/compilation.json');
return {
babel: babelQuery,
ts: {
transpileOnly: true,
compilerOptions: tsQuery
},
output: {
path: (0, _path.join)(process.cwd(), './dist/'),
filename: jsFileName,
chunkFilename: jsFileName
},
devtool: args.devtool,
resolve: {
modulesDirectories: ['node_modules', (0, _path.join)(__dirname, '../node_modules')],
extensions: ['', '.web.tsx', '.web.ts', '.web.jsx', '.web.js', '.ts', '.tsx', '.js', '.jsx', '.json']
},
resolveLoader: {
modulesDirectories: ['node_modules', (0, _path.join)(__dirname, '../node_modules')]
},
entry: pkg.entry,
node: node,
module: {
noParse: [/moment.js/],
loaders: [{
test: /\.js$/,
exclude: /node_modules/,
loader: require.resolve('babel-loader'),
query: babelQuery
}, {
test: /\.jsx$/,
loader: require.resolve('babel-loader'),
query: babelQuery
}, {
test: /\.tsx?$/,
loaders: [require.resolve('babel-loader'), require.resolve('ts-loader')]
}, {
test: function test(filePath) {
return (/\.css$/.test(filePath) && !/\.module\.css$/.test(filePath)
);
},
loader: _extractTextWebpackPlugin2.default.extract('' + require.resolve('css-loader') + ('?sourceMap&-restructuring&-autoprefixer!' + require.resolve('postcss-loader')))
}, {
test: /\.module\.css$/,
loader: _extractTextWebpackPlugin2.default.extract('' + require.resolve('css-loader') + '?sourceMap&-restructuring&modules&localIdentName=[local]___[hash:base64:5]&-autoprefixer!' + ('' + require.resolve('postcss-loader')))
}, {
test: function test(filePath) {
return (/\.less$/.test(filePath) && !/\.module\.less$/.test(filePath)
);
},
loader: _extractTextWebpackPlugin2.default.extract(require.resolve('css-loader') + '?sourceMap&-autoprefixer!' + (require.resolve('postcss-loader') + '!') + (require.resolve('less-loader') + '?{"sourceMap":true,"modifyVars":' + JSON.stringify(theme) + '}'))
}, {
test: /\.module\.less$/,
loader: _extractTextWebpackPlugin2.default.extract(require.resolve('css-loader') + '?' + 'sourceMap&modules&localIdentName=[local]___[hash:base64:5]&-autoprefixer!' + (require.resolve('postcss-loader') + '!') + (require.resolve('less-loader') + '?') + ('{"sourceMap":true,"modifyVars":' + JSON.stringify(theme) + '}'))
}, {
test: /\.woff(\?v=\d+\.\d+\.\d+)?$/,
loader: require.resolve('url-loader') + '?' + 'limit=10000&minetype=application/font-woff'
}, {
test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/,
loader: require.resolve('url-loader') + '?' + 'limit=10000&minetype=application/font-woff'
}, {
test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/,
loader: require.resolve('url-loader') + '?' + 'limit=10000&minetype=application/octet-stream'
}, { test: /\.eot(\?v=\d+\.\d+\.\d+)?$/,
loader: require.resolve('url-loader') + '?' + 'limit=10000&minetype=application/vnd.ms-fontobject'
}, {
test: /\.svg(\?v=\d+\.\d+\.\d+)?$/,
loader: require.resolve('url-loader') + '?' + 'limit=10000&minetype=image/svg+xml'
}, {
test: /\.(png|jpg|jpeg|gif)(\?v=\d+\.\d+\.\d+)?$/i,
loader: require.resolve('url-loader') + '?limit=10000'
}, {
test: /\.json$/,
loader: '' + require.resolve('json-loader')
}, {
test: /\.html?$/,
loader: require.resolve('file-loader') + '?name=[name].[ext]'
}]
},
postcss: [(0, _rucksackCss2.default)(), (0, _autoprefixer2.default)({
browsers: ['last 2 versions', 'Firefox ESR', '> 1%', 'ie >= 8', 'iOS >= 8', 'Android >= 4']
})],
plugins: [new _webpack2.default.optimize.CommonsChunkPlugin('common', commonName), new _extractTextWebpackPlugin2.default(cssFileName, {
disable: false,
allChunks: true
}), new _webpack2.default.optimize.OccurenceOrderPlugin(), new _caseSensitivePathsWebpackPlugin2.default(), new _buildStatisticsWebpackPlugin2.default({
path: stagesPath
}), new _bigbrotherWebpackPlugin2.default({
cwd: args.cwd,
tool: {
name: 'atool-build',
version: atoolBuildPkg.version,
stagesPath: stagesPath
}
}), new _friendlyErrorsWebpackPlugin2.default({
onErrors: function onErrors(severity, errors) {
if (silent) return;
if (severity !== 'error') {
_nodeNotifier2.default.notify({
title: 'ant tool',
message: 'warn',
contentImage: (0, _path.join)(__dirname, '../assets/warn.png'),
sound: 'Glass'
});
return;
}
var error = errors[0];
_nodeNotifier2.default.notify({
title: 'ant tool',
message: severity + ' : ' + error.name,
subtitle: error.file || '',
contentImage: (0, _path.join)(__dirname, '../assets/fail.png'),
sound: 'Glass'
});
}
})]
};
}
module.exports = exports['default'];