Why: * We use immutable.js 3.8.2 which is ancient and not getting updates * immutable.js adds 55KB to the bundle, of which we use almost nothing * immutable.js's treatment of 0 and -0 is nonsensical and would require weird workarounds like https://github.com/TurboWarp/scratch-vm/pull/320 * We don't benefit from the whole immutability thing What we're doing instead: * We have our own MonitorState and MonitorRecord classes * We track dirty-ness at modification time instead of equality checking every tick * scratch-gui and packager can continue to think we use immutable.js without causing issues in either direction * our objects have enough stubs that immutable.js-expecting consumers are ok * when receiving an object, we check if it looks like an immutable.js one and ask for the plain JS version so that works okay too
139 lines
4.1 KiB
JavaScript
139 lines
4.1 KiB
JavaScript
const CopyWebpackPlugin = require('copy-webpack-plugin');
|
|
const defaultsDeep = require('lodash.defaultsdeep');
|
|
const path = require('path');
|
|
|
|
const base = {
|
|
mode: process.env.NODE_ENV === 'production' ? 'production' : 'development',
|
|
devServer: {
|
|
contentBase: false,
|
|
host: '0.0.0.0',
|
|
port: process.env.PORT || 8073
|
|
},
|
|
devtool: 'cheap-module-source-map',
|
|
output: {
|
|
library: 'VirtualMachine',
|
|
filename: '[name].js'
|
|
},
|
|
module: {
|
|
rules: [{
|
|
test: /\.js$/,
|
|
loader: 'babel-loader',
|
|
include: path.resolve(__dirname, 'src'),
|
|
query: {
|
|
presets: [['@babel/preset-env']]
|
|
}
|
|
},
|
|
{
|
|
test: /\.mp3$/,
|
|
loader: 'file-loader',
|
|
options: {
|
|
outputPath: 'media/music/'
|
|
}
|
|
}]
|
|
},
|
|
plugins: []
|
|
};
|
|
|
|
module.exports = [
|
|
// Web-compatible
|
|
defaultsDeep({}, base, {
|
|
target: 'web',
|
|
entry: {
|
|
'scratch-vm': './src/index.js',
|
|
'scratch-vm.min': './src/index.js'
|
|
},
|
|
output: {
|
|
libraryTarget: 'umd',
|
|
path: path.resolve('dist', 'web')
|
|
},
|
|
module: {
|
|
rules: base.module.rules.concat([
|
|
{
|
|
test: require.resolve('./src/index.js'),
|
|
loader: 'expose-loader?VirtualMachine'
|
|
}
|
|
])
|
|
}
|
|
}),
|
|
// Node-compatible
|
|
defaultsDeep({}, base, {
|
|
target: 'node',
|
|
entry: {
|
|
'scratch-vm': './src/index.js'
|
|
},
|
|
output: {
|
|
libraryTarget: 'commonjs2',
|
|
path: path.resolve('dist', 'node')
|
|
},
|
|
externals: {
|
|
'decode-html': true,
|
|
'format-message': true,
|
|
'htmlparser2': true,
|
|
'scratch-parser': true,
|
|
'socket.io-client': true,
|
|
'text-encoding': true
|
|
}
|
|
}),
|
|
// Playground
|
|
defaultsDeep({}, base, {
|
|
target: 'web',
|
|
entry: {
|
|
'benchmark': './src/playground/benchmark',
|
|
'video-sensing-extension-debug': './src/extensions/scratch3_video_sensing/debug'
|
|
},
|
|
output: {
|
|
path: path.resolve(__dirname, 'playground'),
|
|
filename: '[name].js'
|
|
},
|
|
module: {
|
|
rules: base.module.rules.concat([
|
|
{
|
|
test: require.resolve('./src/index.js'),
|
|
loader: 'expose-loader?VirtualMachine'
|
|
},
|
|
{
|
|
test: require.resolve('./src/extensions/scratch3_video_sensing/debug.js'),
|
|
loader: 'expose-loader?Scratch3VideoSensingDebug'
|
|
},
|
|
{
|
|
test: require.resolve('stats.js/build/stats.min.js'),
|
|
loader: 'script-loader'
|
|
},
|
|
{
|
|
test: require.resolve('scratch-blocks/dist/vertical.js'),
|
|
loader: 'expose-loader?Blockly'
|
|
},
|
|
{
|
|
test: require.resolve('scratch-audio/src/index.js'),
|
|
loader: 'expose-loader?AudioEngine'
|
|
},
|
|
{
|
|
test: require.resolve('scratch-storage/src/index.js'),
|
|
loader: 'expose-loader?ScratchStorage'
|
|
},
|
|
{
|
|
test: require.resolve('scratch-render/src/index.js'),
|
|
loader: 'expose-loader?ScratchRender'
|
|
}
|
|
])
|
|
},
|
|
performance: {
|
|
hints: false
|
|
},
|
|
plugins: base.plugins.concat([
|
|
new CopyWebpackPlugin([{
|
|
from: 'node_modules/scratch-blocks/media',
|
|
to: 'media'
|
|
}, {
|
|
from: 'node_modules/scratch-storage/dist/web'
|
|
}, {
|
|
from: 'node_modules/scratch-render/dist/web'
|
|
}, {
|
|
from: 'node_modules/@turbowarp/scratch-svg-renderer/dist/web'
|
|
}, {
|
|
from: 'src/playground'
|
|
}])
|
|
])
|
|
})
|
|
];
|