editor.js/webpack.config.js

179 lines
5.5 KiB
JavaScript
Raw Normal View History

/**
* Webpack configuration
*
* @author Codex Team
* @copyright Khaydarov Murod
*/
'use strict';
var pkg = require('./package.json');
var path = require('path');
/**
* Environment
* @type {any}
*/
const NODE_ENV = process.env.NODE_ENV || 'development';
const VERSION = process.env.VERSION || pkg.version;
/**
* Plugins for bundle
* @type {webpack}
*/
var webpack = require('webpack');
/**
* File system
*/
var fs = require('fs');
/**
* Available CodeX Editor modules placed in components/modules folder
* They will required automatically.
* Folders and files starting with '_' will be skipped
* @type {Array}
*/
var editorModules = fs.readdirSync('./src/components/modules').filter( name => /.js$/.test(name) && name.substring(0,1) !== '_' );
editorModules.forEach( name => {
console.log('Require modules/' + name);
});
module.exports = {
entry: {
'codex-editor': './src/codex'
},
output: {
path: path.resolve(__dirname, 'build'),
2017-11-01 22:27:20 +01:00
filename: '[name].js',
library: [ 'CodexEditor' ]
},
watch: true,
watchOptions: {
Autoloading improved, utilities now global (#225) * Autoloading improved, utilities now global # Autoloading Webpack специально не дает использовать переменные в реквайрах типа: let moduleName = 'toolbar.js'; let module = require(moduleName); У нас в автолоадинге было так: let modules = editorModules.map( module => require('./components/modules/' + module )); и это работало, но не так как нужно. Он подключал не только нужные модули из массива editorModules, а вообще все модули из папки components/modules. Я заметил, что они попадают в сборку, хоть и не указаны в реквайрах. Оказывается это так и задумано: Webpack на этапе компиляции не знает что будет в переменной, то есть какой там будет модуль. А ему нужно высчитать время компиляции, поэтому он вкладывет в сброрку тупо все файлы из этой папки, и для каждого высчитывает время. Так что по сути это было то же самое что просто написать require('./components/modules/') и подключить все файлы. Но наш автолоадер должен был подключать только указанные файлы, не заходить в подпапки и не включать файлы, начинающиеся с подчеркивания. Теперь автолоадинг работает так, как и задумывалось. # Global visible modules Теперь не нужно в каждом файле писать import $ from '../dom'; и тд. Они автоматически будут доступны внутри модулей * Update util.Dom * Remove duplicated Babel helpers. Now it will be defined at once
2017-12-02 13:35:55 +01:00
aggregateTimeout: 50
},
2017-11-01 22:27:20 +01:00
devtool: NODE_ENV == 'development' ? 'source-map' : null,
/**
* Tell webpack what directories should be searched when resolving modules.
*/
resolve : {
// fallback: path.join(__dirname, 'node_modules'),
Autoloading improved, utilities now global (#225) * Autoloading improved, utilities now global # Autoloading Webpack специально не дает использовать переменные в реквайрах типа: let moduleName = 'toolbar.js'; let module = require(moduleName); У нас в автолоадинге было так: let modules = editorModules.map( module => require('./components/modules/' + module )); и это работало, но не так как нужно. Он подключал не только нужные модули из массива editorModules, а вообще все модули из папки components/modules. Я заметил, что они попадают в сборку, хоть и не указаны в реквайрах. Оказывается это так и задумано: Webpack на этапе компиляции не знает что будет в переменной, то есть какой там будет модуль. А ему нужно высчитать время компиляции, поэтому он вкладывет в сброрку тупо все файлы из этой папки, и для каждого высчитывает время. Так что по сути это было то же самое что просто написать require('./components/modules/') и подключить все файлы. Но наш автолоадер должен был подключать только указанные файлы, не заходить в подпапки и не включать файлы, начинающиеся с подчеркивания. Теперь автолоадинг работает так, как и задумывалось. # Global visible modules Теперь не нужно в каждом файле писать import $ from '../dom'; и тд. Они автоматически будут доступны внутри модулей * Update util.Dom * Remove duplicated Babel helpers. Now it will be defined at once
2017-12-02 13:35:55 +01:00
modules : [ path.join(__dirname, "src"), "node_modules"],
alias: {
'utils': path.resolve(__dirname + '/src/components/', './utils'),
'dom': path.resolve(__dirname + '/src/components/', './dom'),
}
},
//
// resolveLoader : {
// modules: [ path.resolve(__dirname, "src"), "node_modules" ],
// moduleTemplates: ['*-webpack-loader', '*-web-loader', '*-loader', '*'],
// extensions: ['.js']
// },
plugins: [
/** Pass variables into modules */
new webpack.DefinePlugin({
NODE_ENV: JSON.stringify(NODE_ENV),
VERSION: JSON.stringify(VERSION),
editorModules: JSON.stringify(editorModules)
}),
Autoloading improved, utilities now global (#225) * Autoloading improved, utilities now global # Autoloading Webpack специально не дает использовать переменные в реквайрах типа: let moduleName = 'toolbar.js'; let module = require(moduleName); У нас в автолоадинге было так: let modules = editorModules.map( module => require('./components/modules/' + module )); и это работало, но не так как нужно. Он подключал не только нужные модули из массива editorModules, а вообще все модули из папки components/modules. Я заметил, что они попадают в сборку, хоть и не указаны в реквайрах. Оказывается это так и задумано: Webpack на этапе компиляции не знает что будет в переменной, то есть какой там будет модуль. А ему нужно высчитать время компиляции, поэтому он вкладывет в сброрку тупо все файлы из этой папки, и для каждого высчитывает время. Так что по сути это было то же самое что просто написать require('./components/modules/') и подключить все файлы. Но наш автолоадер должен был подключать только указанные файлы, не заходить в подпапки и не включать файлы, начинающиеся с подчеркивания. Теперь автолоадинг работает так, как и задумывалось. # Global visible modules Теперь не нужно в каждом файле писать import $ from '../dom'; и тд. Они автоматически будут доступны внутри модулей * Update util.Dom * Remove duplicated Babel helpers. Now it will be defined at once
2017-12-02 13:35:55 +01:00
/**
* Setting up a dynamic requires that we use to autoload Editor Modules from 'components/modules' dir
* {@link https://webpack.js.org/plugins/context-replacement-plugin/}
*/
new webpack.ContextReplacementPlugin(
/src\/components\/modules/,
false, // newContentRecursive=false because we dont need to include folders
new RegExp(
'[^_]' + // dont match names started with '_'
`(${editorModules.join('|')})` + // module names pattern: (events.js|ui.js|...)
'$' // at the end of path
)
),
/**
* Automatically load global visible modules
* instead of having to import/require them everywhere.
*/
new webpack.ProvidePlugin({
'_': 'utils',
'$': 'dom',
'Module': './../__module',
}),
Autoloading improved, utilities now global (#225) * Autoloading improved, utilities now global # Autoloading Webpack специально не дает использовать переменные в реквайрах типа: let moduleName = 'toolbar.js'; let module = require(moduleName); У нас в автолоадинге было так: let modules = editorModules.map( module => require('./components/modules/' + module )); и это работало, но не так как нужно. Он подключал не только нужные модули из массива editorModules, а вообще все модули из папки components/modules. Я заметил, что они попадают в сборку, хоть и не указаны в реквайрах. Оказывается это так и задумано: Webpack на этапе компиляции не знает что будет в переменной, то есть какой там будет модуль. А ему нужно высчитать время компиляции, поэтому он вкладывет в сброрку тупо все файлы из этой папки, и для каждого высчитывает время. Так что по сути это было то же самое что просто написать require('./components/modules/') и подключить все файлы. Но наш автолоадер должен был подключать только указанные файлы, не заходить в подпапки и не включать файлы, начинающиеся с подчеркивания. Теперь автолоадинг работает так, как и задумывалось. # Global visible modules Теперь не нужно в каждом файле писать import $ from '../dom'; и тд. Они автоматически будут доступны внутри модулей * Update util.Dom * Remove duplicated Babel helpers. Now it will be defined at once
2017-12-02 13:35:55 +01:00
/** Минифицируем CSS и JS */
2017-11-01 22:27:20 +01:00
// new webpack.optimize.UglifyJsPlugin({
/** Disable warning messages. Cant disable uglify for 3rd party libs such as html-janitor */
2017-11-01 22:27:20 +01:00
// compress: {
// warnings: false
// }
// }),
/** Block biuld if errors found */
2017-11-20 22:17:18 +01:00
// new webpack.NoErrorsPlugin(),
],
module : {
rules : [
{
test : /\.js$/,
exclude: /node_modules/,
use : {
loader: 'babel-loader',
options: {
presets: [ __dirname + '/node_modules/babel-preset-es2015' ],
Autoloading improved, utilities now global (#225) * Autoloading improved, utilities now global # Autoloading Webpack специально не дает использовать переменные в реквайрах типа: let moduleName = 'toolbar.js'; let module = require(moduleName); У нас в автолоадинге было так: let modules = editorModules.map( module => require('./components/modules/' + module )); и это работало, но не так как нужно. Он подключал не только нужные модули из массива editorModules, а вообще все модули из папки components/modules. Я заметил, что они попадают в сборку, хоть и не указаны в реквайрах. Оказывается это так и задумано: Webpack на этапе компиляции не знает что будет в переменной, то есть какой там будет модуль. А ему нужно высчитать время компиляции, поэтому он вкладывет в сброрку тупо все файлы из этой папки, и для каждого высчитывает время. Так что по сути это было то же самое что просто написать require('./components/modules/') и подключить все файлы. Но наш автолоадер должен был подключать только указанные файлы, не заходить в подпапки и не включать файлы, начинающиеся с подчеркивания. Теперь автолоадинг работает так, как и задумывалось. # Global visible modules Теперь не нужно в каждом файле писать import $ from '../dom'; и тд. Они автоматически будут доступны внутри модулей * Update util.Dom * Remove duplicated Babel helpers. Now it will be defined at once
2017-12-02 13:35:55 +01:00
plugins: [
/**
* Dont need to use «.default» after «export default Class Ui {}»
* @see {@link https://github.com/59naga/babel-plugin-add-module-exports}
*/
'add-module-exports',
Autoloading improved, utilities now global (#225) * Autoloading improved, utilities now global # Autoloading Webpack специально не дает использовать переменные в реквайрах типа: let moduleName = 'toolbar.js'; let module = require(moduleName); У нас в автолоадинге было так: let modules = editorModules.map( module => require('./components/modules/' + module )); и это работало, но не так как нужно. Он подключал не только нужные модули из массива editorModules, а вообще все модули из папки components/modules. Я заметил, что они попадают в сборку, хоть и не указаны в реквайрах. Оказывается это так и задумано: Webpack на этапе компиляции не знает что будет в переменной, то есть какой там будет модуль. А ему нужно высчитать время компиляции, поэтому он вкладывет в сброрку тупо все файлы из этой папки, и для каждого высчитывает время. Так что по сути это было то же самое что просто написать require('./components/modules/') и подключить все файлы. Но наш автолоадер должен был подключать только указанные файлы, не заходить в подпапки и не включать файлы, начинающиеся с подчеркивания. Теперь автолоадинг работает так, как и задумывалось. # Global visible modules Теперь не нужно в каждом файле писать import $ from '../dom'; и тд. Они автоматически будут доступны внутри модулей * Update util.Dom * Remove duplicated Babel helpers. Now it will be defined at once
2017-12-02 13:35:55 +01:00
/**
* Babel transforms some awesome ES6 features to ES5 with extra code, such as Class, JSX.
* This plugin makes all generated extra codes to one module which significantly reduces the bundle code size.
*
* {@link https://github.com/brianZeng/babel-plugin-transform-helper}
* @since 11 dec 2017 - removed due to plugin does not supports class inheritance
Autoloading improved, utilities now global (#225) * Autoloading improved, utilities now global # Autoloading Webpack специально не дает использовать переменные в реквайрах типа: let moduleName = 'toolbar.js'; let module = require(moduleName); У нас в автолоадинге было так: let modules = editorModules.map( module => require('./components/modules/' + module )); и это работало, но не так как нужно. Он подключал не только нужные модули из массива editorModules, а вообще все модули из папки components/modules. Я заметил, что они попадают в сборку, хоть и не указаны в реквайрах. Оказывается это так и задумано: Webpack на этапе компиляции не знает что будет в переменной, то есть какой там будет модуль. А ему нужно высчитать время компиляции, поэтому он вкладывет в сброрку тупо все файлы из этой папки, и для каждого высчитывает время. Так что по сути это было то же самое что просто написать require('./components/modules/') и подключить все файлы. Но наш автолоадер должен был подключать только указанные файлы, не заходить в подпапки и не включать файлы, начинающиеся с подчеркивания. Теперь автолоадинг работает так, как и задумывалось. # Global visible modules Теперь не нужно в каждом файле писать import $ from '../dom'; и тд. Они автоматически будут доступны внутри модулей * Update util.Dom * Remove duplicated Babel helpers. Now it will be defined at once
2017-12-02 13:35:55 +01:00
*/
// ['babel-plugin-transform-helper', {
// helperFilename:'build/__tmp_babel_helpers.js'
// }],
Autoloading improved, utilities now global (#225) * Autoloading improved, utilities now global # Autoloading Webpack специально не дает использовать переменные в реквайрах типа: let moduleName = 'toolbar.js'; let module = require(moduleName); У нас в автолоадинге было так: let modules = editorModules.map( module => require('./components/modules/' + module )); и это работало, но не так как нужно. Он подключал не только нужные модули из массива editorModules, а вообще все модули из папки components/modules. Я заметил, что они попадают в сборку, хоть и не указаны в реквайрах. Оказывается это так и задумано: Webpack на этапе компиляции не знает что будет в переменной, то есть какой там будет модуль. А ему нужно высчитать время компиляции, поэтому он вкладывет в сброрку тупо все файлы из этой папки, и для каждого высчитывает время. Так что по сути это было то же самое что просто написать require('./components/modules/') и подключить все файлы. Но наш автолоадер должен был подключать только указанные файлы, не заходить в подпапки и не включать файлы, начинающиеся с подчеркивания. Теперь автолоадинг работает так, как и задумывалось. # Global visible modules Теперь не нужно в каждом файле писать import $ from '../dom'; и тд. Они автоматически будут доступны внутри модулей * Update util.Dom * Remove duplicated Babel helpers. Now it will be defined at once
2017-12-02 13:35:55 +01:00
'class-display-name',
]
}
}
},
{
test : /\.js$/,
use: 'eslint-loader?fix=true',
Autoloading improved, utilities now global (#225) * Autoloading improved, utilities now global # Autoloading Webpack специально не дает использовать переменные в реквайрах типа: let moduleName = 'toolbar.js'; let module = require(moduleName); У нас в автолоадинге было так: let modules = editorModules.map( module => require('./components/modules/' + module )); и это работало, но не так как нужно. Он подключал не только нужные модули из массива editorModules, а вообще все модули из папки components/modules. Я заметил, что они попадают в сборку, хоть и не указаны в реквайрах. Оказывается это так и задумано: Webpack на этапе компиляции не знает что будет в переменной, то есть какой там будет модуль. А ему нужно высчитать время компиляции, поэтому он вкладывет в сброрку тупо все файлы из этой папки, и для каждого высчитывает время. Так что по сути это было то же самое что просто написать require('./components/modules/') и подключить все файлы. Но наш автолоадер должен был подключать только указанные файлы, не заходить в подпапки и не включать файлы, начинающиеся с подчеркивания. Теперь автолоадинг работает так, как и задумывалось. # Global visible modules Теперь не нужно в каждом файле писать import $ from '../dom'; и тд. Они автоматически будут доступны внутри модулей * Update util.Dom * Remove duplicated Babel helpers. Now it will be defined at once
2017-12-02 13:35:55 +01:00
exclude: /(node_modules|build)/ // dont need to look in '/build' to prevent analyse __tmp_babel_helper.js
},
{
test: /\.css$/,
exclude: /node_modules/,
use: [
{
loader: 'css-loader',
options: {
// minimize: 1,
importLoaders: 1
}
},
'postcss-loader'
]
}
]
}
};