parent
9b4a1db997
commit
6fa10e6a36
2 changed files with 57 additions and 73 deletions
6
.prettierignore
Normal file
6
.prettierignore
Normal file
|
@ -0,0 +1,6 @@
|
|||
/node_modules/
|
||||
/public/
|
||||
/vendor/
|
||||
karma.config.js
|
||||
webpack.config.js
|
||||
svg.config.js
|
|
@ -9,14 +9,12 @@ const StatsWriterPlugin = require('webpack-stats-plugin').StatsWriterPlugin;
|
|||
const CopyWebpackPlugin = require('copy-webpack-plugin');
|
||||
const CompressionPlugin = require('compression-webpack-plugin');
|
||||
const NameAllModulesPlugin = require('name-all-modules-plugin');
|
||||
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer')
|
||||
.BundleAnalyzerPlugin;
|
||||
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
|
||||
const WatchMissingNodeModulesPlugin = require('react-dev-utils/WatchMissingNodeModulesPlugin');
|
||||
|
||||
const ROOT_PATH = path.resolve(__dirname, '..');
|
||||
const IS_PRODUCTION = process.env.NODE_ENV === 'production';
|
||||
const IS_DEV_SERVER =
|
||||
process.argv.join(' ').indexOf('webpack-dev-server') !== -1;
|
||||
const IS_DEV_SERVER = process.argv.join(' ').indexOf('webpack-dev-server') !== -1;
|
||||
const DEV_SERVER_HOST = process.env.DEV_SERVER_HOST || 'localhost';
|
||||
const DEV_SERVER_PORT = parseInt(process.env.DEV_SERVER_PORT, 10) || 3808;
|
||||
const DEV_SERVER_LIVERELOAD = process.env.DEV_SERVER_LIVERELOAD !== 'false';
|
||||
|
@ -29,10 +27,10 @@ let watchAutoEntries = [];
|
|||
function generateEntries() {
|
||||
// generate automatic entry points
|
||||
const autoEntries = {};
|
||||
const pageEntries = glob.sync('pages/**/index.js', {
|
||||
cwd: path.join(ROOT_PATH, 'app/assets/javascripts'),
|
||||
});
|
||||
watchAutoEntries = [path.join(ROOT_PATH, 'app/assets/javascripts/pages/')];
|
||||
const pageEntries = glob.sync('pages/**/index.js', { cwd: path.join(ROOT_PATH, 'app/assets/javascripts') });
|
||||
watchAutoEntries = [
|
||||
path.join(ROOT_PATH, 'app/assets/javascripts/pages/'),
|
||||
];
|
||||
|
||||
function generateAutoEntries(path, prefix = '.') {
|
||||
const chunkPath = path.replace(/\/index\.js$/, '');
|
||||
|
@ -40,16 +38,16 @@ function generateEntries() {
|
|||
autoEntries[chunkName] = `${prefix}/${path}`;
|
||||
}
|
||||
|
||||
pageEntries.forEach(path => generateAutoEntries(path));
|
||||
pageEntries.forEach(( path ) => generateAutoEntries(path));
|
||||
|
||||
autoEntriesCount = Object.keys(autoEntries).length;
|
||||
|
||||
const manualEntries = {
|
||||
common: './commons/index.js',
|
||||
main: './main.js',
|
||||
raven: './raven/index.js',
|
||||
webpack_runtime: './webpack.js',
|
||||
ide: './ide/index.js',
|
||||
common: './commons/index.js',
|
||||
main: './main.js',
|
||||
raven: './raven/index.js',
|
||||
webpack_runtime: './webpack.js',
|
||||
ide: './ide/index.js',
|
||||
};
|
||||
|
||||
return Object.assign(manualEntries, autoEntries);
|
||||
|
@ -63,12 +61,8 @@ const config = {
|
|||
output: {
|
||||
path: path.join(ROOT_PATH, 'public/assets/webpack'),
|
||||
publicPath: '/assets/webpack/',
|
||||
filename: IS_PRODUCTION
|
||||
? '[name].[chunkhash].bundle.js'
|
||||
: '[name].bundle.js',
|
||||
chunkFilename: IS_PRODUCTION
|
||||
? '[name].[chunkhash].chunk.js'
|
||||
: '[name].chunk.js',
|
||||
filename: IS_PRODUCTION ? '[name].[chunkhash].bundle.js' : '[name].bundle.js',
|
||||
chunkFilename: IS_PRODUCTION ? '[name].[chunkhash].chunk.js' : '[name].chunk.js',
|
||||
},
|
||||
|
||||
module: {
|
||||
|
@ -97,8 +91,8 @@ const config = {
|
|||
{
|
||||
loader: 'worker-loader',
|
||||
options: {
|
||||
inline: true,
|
||||
},
|
||||
inline: true
|
||||
}
|
||||
},
|
||||
{ loader: 'babel-loader' },
|
||||
],
|
||||
|
@ -109,7 +103,7 @@ const config = {
|
|||
loader: 'file-loader',
|
||||
options: {
|
||||
name: '[name].[hash].[ext]',
|
||||
},
|
||||
}
|
||||
},
|
||||
{
|
||||
test: /katex.css$/,
|
||||
|
@ -119,8 +113,8 @@ const config = {
|
|||
{
|
||||
loader: 'css-loader',
|
||||
options: {
|
||||
name: '[name].[hash].[ext]',
|
||||
},
|
||||
name: '[name].[hash].[ext]'
|
||||
}
|
||||
},
|
||||
],
|
||||
},
|
||||
|
@ -130,18 +124,15 @@ const config = {
|
|||
loader: 'file-loader',
|
||||
options: {
|
||||
name: '[name].[hash].[ext]',
|
||||
},
|
||||
}
|
||||
},
|
||||
{
|
||||
test: /monaco-editor\/\w+\/vs\/loader\.js$/,
|
||||
use: [
|
||||
{ loader: 'exports-loader', options: 'l.global' },
|
||||
{
|
||||
loader: 'imports-loader',
|
||||
options: 'l=>{},this=>l,AMDLoader=>this,module=>undefined',
|
||||
},
|
||||
{ loader: 'imports-loader', options: 'l=>{},this=>l,AMDLoader=>this,module=>undefined' },
|
||||
],
|
||||
},
|
||||
}
|
||||
],
|
||||
|
||||
noParse: [/monaco-editor\/\w+\/vs\//],
|
||||
|
@ -159,10 +150,10 @@ const config = {
|
|||
source: false,
|
||||
chunks: false,
|
||||
modules: false,
|
||||
assets: true,
|
||||
assets: true
|
||||
});
|
||||
return JSON.stringify(stats, null, 2);
|
||||
},
|
||||
}
|
||||
}),
|
||||
|
||||
// prevent pikaday from including moment.js
|
||||
|
@ -179,7 +170,7 @@ const config = {
|
|||
new NameAllModulesPlugin(),
|
||||
|
||||
// assign deterministic chunk ids
|
||||
new webpack.NamedChunksPlugin(chunk => {
|
||||
new webpack.NamedChunksPlugin((chunk) => {
|
||||
if (chunk.name) {
|
||||
return chunk.name;
|
||||
}
|
||||
|
@ -196,12 +187,9 @@ const config = {
|
|||
const pagesBase = path.join(ROOT_PATH, 'app/assets/javascripts/pages');
|
||||
|
||||
if (m.resource.indexOf(pagesBase) === 0) {
|
||||
moduleNames.push(
|
||||
path
|
||||
.relative(pagesBase, m.resource)
|
||||
.replace(/\/index\.[a-z]+$/, '')
|
||||
.replace(/\//g, '__'),
|
||||
);
|
||||
moduleNames.push(path.relative(pagesBase, m.resource)
|
||||
.replace(/\/index\.[a-z]+$/, '')
|
||||
.replace(/\//g, '__'));
|
||||
} else {
|
||||
moduleNames.push(path.relative(m.context, m.resource));
|
||||
}
|
||||
|
@ -209,8 +197,7 @@ const config = {
|
|||
|
||||
chunk.forEachModule(collectModuleNames);
|
||||
|
||||
const hash = crypto
|
||||
.createHash('sha256')
|
||||
const hash = crypto.createHash('sha256')
|
||||
.update(moduleNames.join('_'))
|
||||
.digest('hex');
|
||||
|
||||
|
@ -228,17 +215,10 @@ const config = {
|
|||
// copy pre-compiled vendor libraries verbatim
|
||||
new CopyWebpackPlugin([
|
||||
{
|
||||
from: path.join(
|
||||
ROOT_PATH,
|
||||
`node_modules/monaco-editor/${IS_PRODUCTION ? 'min' : 'dev'}/vs`,
|
||||
),
|
||||
from: path.join(ROOT_PATH, `node_modules/monaco-editor/${IS_PRODUCTION ? 'min' : 'dev'}/vs`),
|
||||
to: 'monaco-editor/vs',
|
||||
transform: function(content, path) {
|
||||
if (
|
||||
/\.js$/.test(path) &&
|
||||
!/worker/i.test(path) &&
|
||||
!/typescript/i.test(path)
|
||||
) {
|
||||
if (/\.js$/.test(path) && !/worker/i.test(path) && !/typescript/i.test(path)) {
|
||||
return (
|
||||
'(function(){\n' +
|
||||
'var define = this.define, require = this.require;\n' +
|
||||
|
@ -248,23 +228,23 @@ const config = {
|
|||
);
|
||||
}
|
||||
return content;
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
]),
|
||||
],
|
||||
|
||||
resolve: {
|
||||
extensions: ['.js'],
|
||||
alias: {
|
||||
'~': path.join(ROOT_PATH, 'app/assets/javascripts'),
|
||||
emojis: path.join(ROOT_PATH, 'fixtures/emojis'),
|
||||
empty_states: path.join(ROOT_PATH, 'app/views/shared/empty_states'),
|
||||
icons: path.join(ROOT_PATH, 'app/views/shared/icons'),
|
||||
images: path.join(ROOT_PATH, 'app/assets/images'),
|
||||
vendor: path.join(ROOT_PATH, 'vendor/assets/javascripts'),
|
||||
vue$: 'vue/dist/vue.esm.js',
|
||||
spec: path.join(ROOT_PATH, 'spec/javascripts'),
|
||||
},
|
||||
'~': path.join(ROOT_PATH, 'app/assets/javascripts'),
|
||||
'emojis': path.join(ROOT_PATH, 'fixtures/emojis'),
|
||||
'empty_states': path.join(ROOT_PATH, 'app/views/shared/empty_states'),
|
||||
'icons': path.join(ROOT_PATH, 'app/views/shared/icons'),
|
||||
'images': path.join(ROOT_PATH, 'app/assets/images'),
|
||||
'vendor': path.join(ROOT_PATH, 'vendor/assets/javascripts'),
|
||||
'vue$': 'vue/dist/vue.esm.js',
|
||||
'spec': path.join(ROOT_PATH, 'spec/javascripts'),
|
||||
}
|
||||
},
|
||||
|
||||
// sqljs requires fs
|
||||
|
@ -279,14 +259,14 @@ if (IS_PRODUCTION) {
|
|||
new webpack.NoEmitOnErrorsPlugin(),
|
||||
new webpack.LoaderOptionsPlugin({
|
||||
minimize: true,
|
||||
debug: false,
|
||||
debug: false
|
||||
}),
|
||||
new webpack.optimize.UglifyJsPlugin({
|
||||
sourceMap: true,
|
||||
sourceMap: true
|
||||
}),
|
||||
new webpack.DefinePlugin({
|
||||
'process.env': { NODE_ENV: JSON.stringify('production') },
|
||||
}),
|
||||
'process.env': { NODE_ENV: JSON.stringify('production') }
|
||||
})
|
||||
);
|
||||
|
||||
// compression can require a lot of compute time and is disabled in CI
|
||||
|
@ -304,7 +284,7 @@ if (IS_DEV_SERVER) {
|
|||
headers: { 'Access-Control-Allow-Origin': '*' },
|
||||
stats: 'errors-only',
|
||||
hot: DEV_SERVER_LIVERELOAD,
|
||||
inline: DEV_SERVER_LIVERELOAD,
|
||||
inline: DEV_SERVER_LIVERELOAD
|
||||
};
|
||||
config.plugins.push(
|
||||
// watch node_modules for changes if we encounter a missing module compile error
|
||||
|
@ -320,14 +300,12 @@ if (IS_DEV_SERVER) {
|
|||
];
|
||||
|
||||
// report our auto-generated bundle count
|
||||
console.log(
|
||||
`${autoEntriesCount} entries from '/pages' automatically added to webpack output.`,
|
||||
);
|
||||
console.log(`${autoEntriesCount} entries from '/pages' automatically added to webpack output.`);
|
||||
|
||||
callback();
|
||||
});
|
||||
})
|
||||
},
|
||||
},
|
||||
}
|
||||
);
|
||||
if (DEV_SERVER_LIVERELOAD) {
|
||||
config.plugins.push(new webpack.HotModuleReplacementPlugin());
|
||||
|
@ -342,7 +320,7 @@ if (WEBPACK_REPORT) {
|
|||
openAnalyzer: false,
|
||||
reportFilename: path.join(ROOT_PATH, 'webpack-report/index.html'),
|
||||
statsFilename: path.join(ROOT_PATH, 'webpack-report/stats.json'),
|
||||
}),
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue