123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- const defaultsDeep = require('lodash.defaultsdeep');
- var path = require('path');
- var webpack = require('webpack');
- // Plugins
- var CopyWebpackPlugin = require('copy-webpack-plugin');
- var HtmlWebpackPlugin = require('html-webpack-plugin');
- var UglifyJsPlugin = require('uglifyjs-webpack-plugin');
- // PostCss
- var autoprefixer = require('autoprefixer');
- var postcssVars = require('postcss-simple-vars');
- var postcssImport = require('postcss-import');
- const STATIC_PATH = process.env.STATIC_PATH || '/static';
- const base = {
- mode: process.env.NODE_ENV === 'production' ? 'production' : 'development',
- devtool: 'cheap-module-source-map',
- devServer: {
- contentBase: path.resolve(__dirname, 'build'),
- host: 'localhost',
- port: process.env.PORT || 8080
- },
- output: {
- library: 'GUI',
- filename: '[name].js',
- chunkFilename: 'chunks/[name].js'
- },
- externals: {
- React: 'react',
- ReactDOM: 'react-dom'
- },
- resolve: {
- symlinks: false
- },
- module: {
- rules: [{
- test: /\.jsx?$/,
- loader: 'babel-loader',
- include: [
- path.resolve(__dirname, 'src'),
- /node_modules[\\/]scratch-[^\\/]+[\\/]src/,
- /node_modules[\\/]pify/,
- /node_modules[\\/]@vernier[\\/]godirect/
- ],
- options: {
- // Explicitly disable babelrc so we don't catch various config
- // in much lower dependencies.
- babelrc: false,
- plugins: [
- '@babel/plugin-syntax-dynamic-import',
- '@babel/plugin-transform-async-to-generator',
- '@babel/plugin-proposal-object-rest-spread',
- ['react-intl', {
- messagesDir: './translations/messages/'
- }]],
- presets: ['@babel/preset-env', '@babel/preset-react']
- }
- },
- {
- test: /\.css$/,
- use: [{
- loader: 'style-loader'
- }, {
- loader: 'css-loader',
- options: {
- modules: true,
- importLoaders: 1,
- localIdentName: '[name]_[local]_[hash:base64:5]',
- camelCase: true
- }
- }, {
- loader: 'postcss-loader',
- options: {
- ident: 'postcss',
- plugins: function () {
- return [
- postcssImport,
- postcssVars,
- autoprefixer
- ];
- }
- }
- }]
- }]
- },
- optimization: {
- minimizer: [
- new UglifyJsPlugin({
- include: /\.min\.js$/
- })
- ]
- },
- plugins: []
- };
- module.exports = [
- // to run editor examples
- defaultsDeep({}, base, {
- entry: {
- 'lib.min': ['react', 'react-dom'],
- 'gui': './src/playground/index.jsx',
- 'blocksonly': './src/playground/blocks-only.jsx',
- 'compatibilitytesting': './src/playground/compatibility-testing.jsx',
- 'player': './src/playground/player.jsx'
- },
- output: {
- path: path.resolve(__dirname, 'build'),
- filename: '[name].js'
- },
- externals: {
- React: 'react',
- ReactDOM: 'react-dom'
- },
- module: {
- rules: base.module.rules.concat([
- {
- test: /\.(svg|png|wav|gif|jpg)$/,
- loader: 'file-loader',
- options: {
- outputPath: 'static/assets/'
- }
- }
- ])
- },
- optimization: {
- splitChunks: {
- chunks: 'all',
- name: 'lib.min'
- },
- runtimeChunk: {
- name: 'lib.min'
- }
- },
- plugins: base.plugins.concat([
- new webpack.DefinePlugin({
- 'process.env.NODE_ENV': '"' + process.env.NODE_ENV + '"',
- 'process.env.DEBUG': Boolean(process.env.DEBUG),
- 'process.env.GA_ID': '"' + (process.env.GA_ID || 'UA-000000-01') + '"'
- }),
- new HtmlWebpackPlugin({
- chunks: ['lib.min', 'gui'],
- template: 'src/playground/index.ejs',
- title: '科乐维·少儿编程 - 停课不停学,免费公益编程课',
- sentryConfig: process.env.SENTRY_CONFIG ? '"' + process.env.SENTRY_CONFIG + '"' : null
- }),
- new HtmlWebpackPlugin({
- chunks: ['lib.min', 'blocksonly'],
- template: 'src/playground/index.ejs',
- filename: 'blocks-only.html',
- title: 'Scratch 3.0 GUI: Blocks Only Example'
- }),
- new HtmlWebpackPlugin({
- chunks: ['lib.min', 'compatibilitytesting'],
- template: 'src/playground/index.ejs',
- filename: 'compatibility-testing.html',
- title: 'Scratch 3.0 GUI: Compatibility Testing'
- }),
- new HtmlWebpackPlugin({
- chunks: ['lib.min', 'player'],
- template: 'src/playground/index.ejs',
- filename: 'player.html',
- title: 'Scratch 3.0 GUI: Player Example'
- }),
- new CopyWebpackPlugin([{
- from: 'static',
- to: 'static'
- }]),
- new CopyWebpackPlugin([{
- from: 'node_modules/scratch-blocks/media',
- to: 'static/blocks-media'
- }]),
- new CopyWebpackPlugin([{
- from: 'extensions/**',
- to: 'static',
- context: 'src/examples'
- }]),
- new CopyWebpackPlugin([{
- from: 'extension-worker.{js,js.map}',
- context: 'node_modules/scratch-vm/dist/web'
- }])
- ])
- })
- ].concat(
- process.env.NODE_ENV === 'production' || process.env.BUILD_MODE === 'dist' ? (
- // export as library
- defaultsDeep({}, base, {
- target: 'web',
- entry: {
- 'scratch-gui': './src/index.js'
- },
- output: {
- libraryTarget: 'umd',
- path: path.resolve('dist'),
- publicPath: `${STATIC_PATH}/`
- },
- externals: {
- React: 'react',
- ReactDOM: 'react-dom'
- },
- module: {
- rules: base.module.rules.concat([
- {
- test: /\.(svg|png|wav|gif|jpg)$/,
- loader: 'file-loader',
- options: {
- outputPath: 'static/assets/',
- publicPath: `${STATIC_PATH}/assets/`
- }
- }
- ])
- },
- plugins: base.plugins.concat([
- new CopyWebpackPlugin([{
- from: 'node_modules/scratch-blocks/media',
- to: 'static/blocks-media'
- }]),
- new CopyWebpackPlugin([{
- from: 'extension-worker.{js,js.map}',
- context: 'node_modules/scratch-vm/dist/web'
- }]),
- // Include library JSON files for scratch-desktop to use for downloading
- new CopyWebpackPlugin([{
- from: 'src/lib/libraries/*.json',
- to: 'libraries',
- flatten: true
- }])
- ])
- })) : []
- );
|