fz-react-cli
Version:
A CLI tool for build modern web application and libraries
190 lines (183 loc) • 5.5 kB
JavaScript
//$Id$//
var path = require('path');
var webpack = require('webpack');
var CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin');
let scriptLoader = require( '../scriptLoader' );
var getIP = require('../utils/ipaddress');
var i18nPlugin = require('../i18nPlugin');
var host = process.env.npm_config_server_host || getIP();
var port = process.env.npm_config_server_port || '9090';
var url = 'htt' + 'ps://' + host + ':' + port;
var context = process.env.npm_config_server_context || 'app';
var appFolder = process.env.npm_config_app_folder || 'src';
var mig = process.env.npm_config_react_mig || false;
var preact = process.env.npm_config_preact_switch || false;
var widgetEnable = process.env.npm_config_widget_enable || false;
var isDisableContextURL = process.env.npm_config_disable_contexturl || false;
var useInsertInto = process.env.npm_config_use_insertInto || false;
var useInsertAt = process.env.npm_config_use_insertAt || false;
if (useInsertInto && useInsertAt) {
throw new Error(
`You can't use style loader's insertInto and insertAt at a same time; Please refer this PR to get more info - https://github.com/webpack-contrib/style-loader/pull/325`
);
}
var styleLoaderOption = {};
if (useInsertInto) {
styleLoaderOption.insertInto = () => {
if (window.styleTarget) {
let element = document.getElementById(window.styleTarget);
return element.shadowRoot ? element.shadowRoot : element;
}
return document.head;
};
} else if (useInsertAt) {
var getInsertAt = require('../utils/getInsertAt');
var insertAt = getInsertAt();
styleLoaderOption.insertAt = insertAt;
}
var contextURL = context;
if (isDisableContextURL) {
contextURL = '';
}
var alias = {};
if (preact) {
alias.react = 'preact-compat';
alias['react-dom'] = 'preact-compat';
}
//var srcPath=path.resolve(__dirname, 'app');
var fs = require('fs');
var appPath = fs.realpathSync(process.cwd());
var isVendor = function isVendor(_ref) {
var userRequest = _ref.userRequest;
return userRequest && userRequest.indexOf('node_modules') >= 0;
};
var isReact = function isReact(_ref) {
var userRequest = _ref.userRequest;
return (
userRequest && userRequest.indexOf('node_modules' + path.sep + 'react') >= 0
);
};
var hookEntries = ['babel-polyfill'];
if (preact) {
hookEntries.push('preact/devtools');
}
var entry = {
main: [
require.resolve('../hmrClient') + `?hmrPath=${url}`,
...hookEntries,
require.resolve('../wmsClient') + `?wmsPath=wss://${host}:${port}`,
require.resolve('react-error-overlay'),
path.join(appPath, appFolder, mig ? 'migration.js' : 'index.js')
]
};
if (widgetEnable) {
entry.widget = path.join(appPath, appFolder, 'widget.js');
}
module.exports = {
entry: entry,
devtool: 'cheap-module-source-map',
output: {
path: path.resolve(appPath, 'build'),
filename: '[name].js',
devtoolModuleFilenameTemplate: info =>
path.resolve(info.absoluteResourcePath),
publicPath: [url, contextURL, 'js'].filter(a => a).join('/'),
jsonpFunction: 'jsonp' + context
},
plugins: [
//write hot module plugin like webpack-dev-server server.js new webpack.HotModuleReplacementPlugin(),
new scriptLoader(),
new CaseSensitivePathsPlugin(),
// new i18nPlugin({
// appPath: appPath,
// context: context
// }),
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
chunks: ['main'],
minChunks: isVendor
}),
new webpack.optimize.CommonsChunkPlugin({
name: 'react.vendor',
chunks: ['vendor'],
minChunks: isReact
}),
new webpack.DefinePlugin({
__CLIENT__: true,
__TEST__: false,
__SERVER__: false,
__DEVELOPMENT__: true,
__DEVTOOLS__: true,
__DOCS__: false
})
],
module: {
rules: [
{
include: /\.json$/,
use: ['json-loader']
},
{
test: /\.jsx|\.js$/,
use: [
{
loader: path.resolve(__dirname, '../instrument.js')
},
{
loader: 'babel-loader',
options: {
presets: [
[require.resolve('babel-preset-es2015'), { modules: false }],
require.resolve('babel-preset-react')
],
cacheDirectory: true
}
} /*,
{
loader: require.resolve('../i18nFilterLoader.js')
}*/
],
include: path.join(appPath, appFolder)
},
{
test: /\.css$/,
use: [
{
loader: 'style-loader',
options: styleLoaderOption
},
'css-loader?modules&localIdentName=[name]__[local]__[hash:base64:5]'
]
},
{
test: /\.jpe?g$|\.gif$|\.png$/,
use: ['url-loader?limit=1000&name=./images/[name].[ext]']
},
{
test: /\.woff2|\.woff$|\.ttf$|\.eot$/,
use: ['url-loader?limit=1000&name=./fonts/[name].[ext]']
},
{
test: /\.svg$/,
use: ['url-loader?limit=1&name=./fonts/[name].[ext]']
}
]
},
externals: {
ZC: '$ZC'
},
resolve: {
alias: alias,
modules: [
path.resolve(__dirname, '..', '..', 'node_modules'),
'node_modules'
]
},
resolveLoader: {
modules: [
path.resolve(__dirname, '..', '..', 'node_modules'),
'node_modules'
]
}
};