Tips and tricks
How to develop a Gutenberg plugin without node_modules
So I have struggled with this for a long time now.
First you need the coresponding libraries
npm i -g @babel/core@^7.2.2 npm i -g @babel/preset-env@^7.3.1 npm i -g @babel/preset-react@^7.0.0 npm i -g autoprefixer@^9.5.0 npm i -g babel-loader@^8.0.5 npm i -g css-loader npm i -g extract-text-webpack-plugin@next npm i -g generate-template-files npm i -g mini-css-extract-plugin npm i -g node-sass npm i -g postcss-loader npm i -g raw-loader npm i -g sass-loader npm i -g style-loader npm i -g webpack@^4.29.0 npm i -g webpack-cli@^3.2.1
So I have struggled with this for a long time now.
The idea is to have your package.json, webpack.config.js, .babelrc files etc and execute
npm link @babel/core npm link @babel/preset-env npm link @babel/preset-react npm link autoprefixer npm link babel-loader npm link css-loader npm link extract-text-webpack-plugin npm link generate-template-files npm link mini-css-extract-plugin npm link node-sass npm link postcss-loader npm link raw-loader npm link sass-loader npm link style-loader npm link webpack npm link webpack-cli
Of course packages and version would have to match the webpack .. babel you are going to use
Our webpack for version 3
const path = require( 'path' );
const webpack = require( 'webpack' );
const ExtractTextPlugin = require( 'extract-text-webpack-plugin' );
// Set different CSS extraction for editor only and common block styles
const blockCSSPlugin = new ExtractTextPlugin( {
filename: './dist/block_player.css',
} );
// Configuration for the ExtractTextPlugin.
const extractConfig = {
use: [
{ loader: 'raw-loader' },
{
loader: 'postcss-loader',
options: {
plugins: [ require( 'autoprefixer' ) ],
},
},
{
loader: 'sass-loader',
query: {
outputStyle:
'production' === process.env.NODE_ENV ? 'compressed' : 'nested',
},
},
],
};
module.exports = {
entry: {
'./dist/block_player' : './gutenberg/block_index.js',
},
output: {
path: path.resolve( __dirname ),
filename: '[name].js',
},
watch: true,
devtool: 'cheap-eval-source-map',
module: {
rules: [
{
test: /\.js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader',
},
},
{
test: /block_player\.s?css$/,
use: blockCSSPlugin.extract( extractConfig ),
},
],
},
plugins: [
blockCSSPlugin
],
};
install script
npm i -g autoprefixer npm i -g babel-core^6.25.0 npm i -g babel-eslint npm i -g babel-loader npm i -g babel-plugin-transform-object-rest-spread npm i -g babel-plugin-transform-react-jsx npm i -g babel-plugin-transform-runtime npm i -g babel-preset-env npm i -g babel-runtime npm i -g cross-env npm i -g css-loader npm i -g extract-text-webpack-plugin npm i -g node-sass npm i -g postcss-loader npm i -g raw-loader npm i -g sass-loader npm i -g style-loader npm i -g webpack^3.12.0
remember to have your attributes in three places:
- in javascript registerBlockType
attributes: window.dzsvg_gutenberg_player_options_for_js_init
- in php register_block_type
'attributes' => $atts_player,