webpack_native 0.4.7 → 0.5.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 80686b5e334f35311ea0c314897a32d9827ce0a431614abefe97508dbe9f7b21
4
- data.tar.gz: 11fc48dca370fb6e185ca1addf6bbe7df0d0248719ab86746ee4c908e9c2564a
3
+ metadata.gz: d3502e8e87605dd20dea5b8c8509eb8ed95269e5bb0bee23f74c16b0500b988c
4
+ data.tar.gz: 9586d22e15d5e78f695df50da43c12d6849459e26cc1ead5e1eabfa86f07ef54
5
5
  SHA512:
6
- metadata.gz: 7a60e3289035818851216ac3c019bb732e3490c6b59a5d72d26f5bad176db90e04a96818df8042c352513a82d8e26e24ccdc09218a5b4f7e2723f4aafa29480e
7
- data.tar.gz: 9605224ecf3d0bde417c28670636021d78b58372bb5120e8241ffcf3b1079afb6f2fd5efa7dd61180df5952d86fdba2ac35820afa774ca1b7daab38db600078c
6
+ metadata.gz: b4b7aa7fe8d78cd9968ae67080e9ec5063b54a6f4edde532d673a5cc8d84ec1cc3508874f0fa145d7852e5db6f81aead923bbcbf15e9f258afc2fd20f189b1c1
7
+ data.tar.gz: 013a76ebae4470190a87d83c864bdb646f1dcc490527c50249a5695f8f6c33d010a6ec8803c236ff3b53b712cfc15b90ad0f1dcca398bfbca5898b2bf53b67eb
@@ -7,6 +7,7 @@ class WebpackNative::DevGenerator < Rails::Generators::Base
7
7
  Mutex.new.synchronize do
8
8
  Dir.chdir "#{Rails.root}/app/webpack_native" do
9
9
  Dir.mkdir('src/images') unless Dir.exist?('src/images')
10
+ Dir.mkdir('src/favicons') unless Dir.exist?('src/favicons')
10
11
  %x{ yarn install }
11
12
  result = %x{ npm run build:dev }
12
13
  puts "\n"
@@ -15,7 +15,9 @@
15
15
  "@babel/preset-env": "^7.11.5",
16
16
  "autoprefixer": "^10.0.0",
17
17
  "babel-loader": "^8.1.0",
18
+ "@gfx/zopfli": "^1.0.15",
18
19
  "clean-webpack-plugin": "^3.0.0",
20
+ "compression-webpack-plugin": "^6.0.3",
19
21
  "css-loader": "^4.3.0",
20
22
  "file-loader": "^6.1.0",
21
23
  "mini-css-extract-plugin": "^0.11.2",
@@ -2,6 +2,7 @@
2
2
  import '../stylesheets/application.scss';
3
3
  // the following line requires that images folder exists
4
4
  require.context('../images', true, /\.(gif|jpeg|jpg|png|svg)$/i);
5
+ require.context('../favicons', true);
5
6
 
6
7
  require("@rails/ujs").start();
7
8
  require("turbolinks").start();
@@ -3,6 +3,8 @@ const MiniCssExtractPlugin = require("mini-css-extract-plugin");
3
3
  const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
4
4
  const TerserJSPlugin = require('terser-webpack-plugin');
5
5
  const { CleanWebpackPlugin } = require('clean-webpack-plugin');
6
+ const CompressionPlugin = require('compression-webpack-plugin');
7
+ const zopfli = require('@gfx/zopfli');
6
8
  const WebpackManifestPlugin = require('webpack-manifest-plugin');
7
9
  const webpack = require('webpack');
8
10
 
@@ -12,7 +14,7 @@ module.exports = (env, options) => {
12
14
 
13
15
  return {
14
16
 
15
- devtool: "cheap-module-eval-source-map",
17
+ devtool: devMode ? "cheap-module-eval-source-map" : undefined,
16
18
  optimization: {
17
19
  minimizer: [
18
20
  new TerserJSPlugin({}),
@@ -23,7 +25,7 @@ module.exports = (env, options) => {
23
25
  application: "./src/javascripts/application.js"
24
26
  },
25
27
  output: {
26
- filename: devMode ? '[name].js' : '[name]-[contenthash].js',
28
+ filename: '[name]-[contenthash].js',
27
29
  path: path.resolve(__dirname, '../../public/webpack_native')
28
30
  },
29
31
  module: {
@@ -55,13 +57,34 @@ module.exports = (env, options) => {
55
57
  ],
56
58
  },
57
59
  {
58
- test: /\.(png|jpg|gif|svg)$/i,
60
+ test: /\.(png|jpg|jpeg|gif|svg|ttf|woff2|woff|eot)$/i,
61
+ exclude: [
62
+ path.resolve(__dirname, "src/favicons")
63
+ ],
59
64
  use: [
60
65
  {
61
66
  loader: 'url-loader',
62
67
  options: {
63
68
  limit: false,
64
- name: devMode ? '[name].[ext]' : '[name]-[hash:7].[ext]'
69
+ name: '[name]-[hash:7].[ext]'
70
+ },
71
+ },
72
+ // { loader: 'image-webpack-loader' }
73
+ ],
74
+ },
75
+ {
76
+ test: /\.(png|jpg|jpeg|svg|ttf|ico|webmanifest)$/i,
77
+ exclude: [
78
+ path.resolve(__dirname, "src/images"),
79
+ path.resolve(__dirname, 'node_modules')
80
+ ],
81
+ use: [
82
+ {
83
+ loader: 'url-loader',
84
+ options: {
85
+ limit: false, //8192,
86
+ name: '[name].[ext]',
87
+ outputPath: '../../public'
65
88
  },
66
89
  },
67
90
  // { loader: 'image-webpack-loader' }
@@ -77,9 +100,33 @@ module.exports = (env, options) => {
77
100
  new WebpackManifestPlugin(),
78
101
  new CleanWebpackPlugin(),
79
102
  new MiniCssExtractPlugin({
80
- filename: devMode ? '[name].css' : '[name]-[contenthash].css',
103
+ filename: '[name]-[contenthash].css',
104
+ }),
105
+ // In production, compress static files to .gz (using zopfli) and .br (using brotli) format
106
+ !devMode && new CompressionPlugin({
107
+ filename: '[path][base].gz[query]',
108
+ compressionOptions: {
109
+ numiterations: 15
110
+ },
111
+ algorithm(input, compressionOptions, callback) {
112
+ return zopfli.gzip(input, compressionOptions, callback);
113
+ },
114
+ test: /\.(js|css|html|svg|ico|eot|ttf|otf|map)$/,
115
+ threshold: 10240,
116
+ minRatio: 0.8,
117
+ deleteOriginalAssets: false
118
+ }),
119
+ !devMode && new CompressionPlugin({
120
+ filename: '[path][base].br',
121
+ algorithm: 'brotliCompress',
122
+ test: /\.(js|css|html|svg|ico|eot|ttf|otf|map)$/,
123
+ compressionOptions: {
124
+ level: 11,
125
+ },
126
+ threshold: 10240,
127
+ minRatio: 0.8,
81
128
  })
82
- ],
129
+ ].filter(Boolean), // filter(Boolean) to prevent false values when it's devMode
83
130
  // resolve: {
84
131
  // alias: {},
85
132
  // modules: [
@@ -89,6 +136,6 @@ module.exports = (env, options) => {
89
136
  // ]
90
137
  // }
91
138
 
92
- }
139
+ };
93
140
 
94
- }
141
+ };
@@ -17,7 +17,8 @@ class WebpackNative::Railtie < ::Rails::Railtie
17
17
  end
18
18
 
19
19
  initializer "webpack_native_set_manifest" do
20
- if Rails.env.production?
20
+
21
+ if Rails.env.production? # on production only
21
22
 
22
23
  # create public/webpack_native if it doesn't exist:
23
24
 
@@ -39,6 +40,7 @@ class WebpackNative::Railtie < ::Rails::Railtie
39
40
  Rails.configuration.x.webpack_native.webpack_manifest_file = WebpackNative::WebpackNativeHelper.load_webpack_manifest
40
41
 
41
42
  end
43
+
42
44
  end
43
45
 
44
46
  def start_webpack
@@ -1,3 +1,3 @@
1
1
  module WebpackNative
2
- VERSION = "0.4.7"
2
+ VERSION = "0.5.4"
3
3
  end
@@ -1,5 +1,5 @@
1
1
  module WebpackNative::WebpackNativeHelper
2
-
2
+
3
3
  def webpack_stylesheet_tag(asset, **html_options)
4
4
  html_options = html_options.merge(
5
5
  href: webpack_stylesheet_path(asset),
@@ -43,6 +43,66 @@ module WebpackNative::WebpackNativeHelper
43
43
  def webpack_image_path(image, **options)
44
44
  image_path(webpack_native_lookup(image), **options)
45
45
  end
46
+
47
+ # ====== Favicon helpers ======
48
+ # usage:
49
+ # <%= webpack_favicons('apple-touch-icon.png', 'favicon-32x32.png', 'favicon-16x16.png') %>
50
+ # <%= webpack_webmanifest('manifest.webmanifest') %>
51
+
52
+ # result:
53
+ #<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
54
+ #<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
55
+ #<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
56
+ #<link rel="manifest" href="/site.webmanifest">
57
+
58
+ def webpack_favicons(*args)
59
+ tags = []
60
+ args.each do |favicon|
61
+
62
+ filename = File.basename(favicon, ".*") # exclude the extension
63
+ ext = File.extname(favicon)
64
+
65
+ if ext == '.webmanifest'
66
+ manifest = favicon
67
+ html_options = {
68
+ rel: 'manifest',
69
+ href: manifest
70
+ }
71
+
72
+ else
73
+ mimetypes = {
74
+ '.png' => 'image/png',
75
+ '.jpg' => 'image/jpg',
76
+ '.jpeg' => 'image/jpeg',
77
+ '.webp' => 'image/webp',
78
+ '.tiff' => 'image/tiff',
79
+ '.svg' => 'image/svg+xml',
80
+ '.ico' => 'image/x-icon'
81
+ }
82
+
83
+ html_options = {
84
+ rel: filename == 'apple-touch-icon' ? 'apple-touch-icon' : 'icon',
85
+ type: mimetypes[ext],
86
+ href: favicon
87
+ }
88
+
89
+ sizes = filename[/(.+)?([0-9]{2,3}x[0-9]{2,3})(.+)?/, 2]
90
+
91
+ sizes = '180×180' if filename == 'apple-touch-icon'
92
+
93
+ html_options = html_options.merge({sizes: sizes}) unless sizes.nil?
94
+
95
+ end
96
+
97
+ tags << tag.link(html_options)
98
+
99
+ end
100
+
101
+ return tags.join.html_safe
102
+
103
+ end
104
+
105
+ # ====== End favicon helpers ======
46
106
 
47
107
  private
48
108
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: webpack_native
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.7
4
+ version: 0.5.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - scratchoo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-16 00:00:00.000000000 Z
11
+ date: 2021-03-13 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Use vanilla webpack to manage your assets efficiently, no webpacker or
14
14
  asset pipeline anymore!