Resolve custom application stylesheet with Webpack (#3373)
This implementation is a bit smaller and still has the following benefits:
* No need of app/javascript/packs/custom.js
For custom stylesheet, it typically has only
"require('../styles/custom.scss')" and is redundant.
* No need to extract vendor stylesheet to another asset
Extracting vendor stylesheet could be forgotten by developers who do not
use custom stylesheet.
			
			
This commit is contained in:
		
				
					committed by
					
						
						Eugen Rochko
					
				
			
			
				
	
			
			
			
						parent
						
							2212dc4aaa
						
					
				
				
					commit
					e98559c3ff
				
			@@ -1,17 +0,0 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
module StyleHelper
 | 
			
		||||
  def stylesheet_for_layout
 | 
			
		||||
    if asset_exist? 'custom.css'
 | 
			
		||||
      'custom'
 | 
			
		||||
    else
 | 
			
		||||
      'application'
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def asset_exist?(path)
 | 
			
		||||
    true if Webpacker::Manifest.lookup(path)
 | 
			
		||||
  rescue Webpacker::FileLoader::NotFoundError
 | 
			
		||||
    false
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
@@ -2,7 +2,7 @@ const perf = require('./performance');
 | 
			
		||||
 | 
			
		||||
// import default stylesheet with variables
 | 
			
		||||
require('font-awesome/css/font-awesome.css');
 | 
			
		||||
require('../styles/application.scss');
 | 
			
		||||
require('mastodon-application-style');
 | 
			
		||||
 | 
			
		||||
function onDomContentLoaded(callback) {
 | 
			
		||||
  if (document.readyState !== 'loading') {
 | 
			
		||||
 
 | 
			
		||||
@@ -18,8 +18,7 @@
 | 
			
		||||
        = ' - '
 | 
			
		||||
      = title
 | 
			
		||||
 | 
			
		||||
    = stylesheet_pack_tag 'common', media: 'all'
 | 
			
		||||
    = stylesheet_pack_tag stylesheet_for_layout, media: 'all'
 | 
			
		||||
    = stylesheet_pack_tag 'application', media: 'all'
 | 
			
		||||
    = javascript_pack_tag 'common', integrity: true, crossorigin: 'anonymous'
 | 
			
		||||
    = javascript_pack_tag "locale_#{I18n.locale}", integrity: true, crossorigin: 'anonymous'
 | 
			
		||||
    = csrf_meta_tags
 | 
			
		||||
 
 | 
			
		||||
@@ -3,6 +3,7 @@
 | 
			
		||||
/* eslint global-require: 0 */
 | 
			
		||||
/* eslint import/no-dynamic-require: 0 */
 | 
			
		||||
 | 
			
		||||
const { existsSync } = require('fs');
 | 
			
		||||
const webpack = require('webpack');
 | 
			
		||||
const { basename, dirname, join, relative, resolve, sep } = require('path');
 | 
			
		||||
const { sync } = require('glob');
 | 
			
		||||
@@ -16,6 +17,9 @@ const extensionGlob = `**/*{${paths.extensions.join(',')}}*`;
 | 
			
		||||
const packPaths = sync(join(paths.source, paths.entry, extensionGlob));
 | 
			
		||||
const entryPacks = [].concat(packPaths).concat(localePackPaths);
 | 
			
		||||
 | 
			
		||||
const customApplicationStyle = resolve(join(paths.source, 'styles/custom.scss'));
 | 
			
		||||
const originalApplicationStyle = resolve(join(paths.source, 'styles/application.scss'));
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
  entry: entryPacks.reduce(
 | 
			
		||||
    (map, entry) => {
 | 
			
		||||
@@ -48,17 +52,13 @@ module.exports = {
 | 
			
		||||
      name: 'common',
 | 
			
		||||
      minChunks: (module, count) => {
 | 
			
		||||
        const reactIntlPathRegexp = new RegExp(`node_modules\\${sep}react-intl`);
 | 
			
		||||
 | 
			
		||||
        if (module.resource && reactIntlPathRegexp.test(module.resource)) {
 | 
			
		||||
          // skip react-intl because it's useless to put in the common chunk,
 | 
			
		||||
          // e.g. because "shared" modules between zh-TW and zh-CN will never
 | 
			
		||||
          // be loaded together
 | 
			
		||||
          return false;
 | 
			
		||||
        }
 | 
			
		||||
        const fontAwesomePathRegexp = new RegExp(`node_modules\\${sep}font-awesome`);
 | 
			
		||||
        if (module.resource && fontAwesomePathRegexp.test(module.resource)) {
 | 
			
		||||
          // extract vendor css into common module
 | 
			
		||||
          return true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return count >= 2;
 | 
			
		||||
      },
 | 
			
		||||
@@ -66,6 +66,10 @@ module.exports = {
 | 
			
		||||
  ],
 | 
			
		||||
 | 
			
		||||
  resolve: {
 | 
			
		||||
    alias: {
 | 
			
		||||
      'mastodon-application-style': existsSync(customApplicationStyle) ?
 | 
			
		||||
                                    customApplicationStyle : originalApplicationStyle,
 | 
			
		||||
    },
 | 
			
		||||
    extensions: paths.extensions,
 | 
			
		||||
    modules: [
 | 
			
		||||
      resolve(paths.source),
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user