Добавить JQuery как отдельный модуль для Webpack - PullRequest
0 голосов
/ 08 мая 2020

Если это важно, я работаю над расширением chrome (возможно, у него есть некоторые ограничения или отдельные аспекты, я не знаю). Сначала я использовал jquery только в контенте. js указал это в манифесте. json. Но теперь я хочу использовать его и во всплывающем окне. js тоже. Указанный jquery в "content_scripts" не предоставляет его для всплывающих окон. Что мне делать, чтобы добавить JQuery как отдельный модуль для пакета Webpack?

Я нашел это:

new webpack.ProvidePlugin(
{
     $               : "jquery/dist/jquery.min.js",
     jQuery          : "jquery/dist/jquery.min.js",
     "window.jQuery" : "jquery/dist/jquery.min.js"
}),

и он работает, но вставляет jquery в каждый файл, который использует это. И js файлы становятся такими "жирными". Webpack говорит:

WARNING in asset size limit: The following asset(s) exceed the recommended size limit (244 KiB).

Это может повлиять на производительность сети.

Вот мой полный webpack.config.js:

'use strict';

const dev                               = 'development';
const prod                              = 'production';
const NODE_ENV                          = process.env.NODE_ENV ||  prod;

const baseManifest                      = require('./Source/manifest.json');

const HtmlWebpackPlugin                 = require('html-webpack-plugin');
const UglifyJsPlugin                    = require('uglifyjs-webpack-plugin');
const webpack                           = require('webpack');
const JavaScriptObfuscator              = require('webpack-obfuscator');
const CopyPlugin                        = require('copy-webpack-plugin');
const WebpackExtensionManifestPlugin    = require('webpack-extension-manifest-plugin');

module.exports =
{
    mode:  prod,

    watch: NODE_ENV ===  dev,
    watchOptions:
    {
        aggregateTimeout: 100
    },

    devtool: NODE_ENV ===  dev ? 'eval' : false,
    context: __dirname + '/Source',

    entry:
        {
            content     : './js/content.js',
            background  : './js/background.js',
            popup       : './js/popup.js'
        },

    output:
        {
            path        : __dirname + '/build',
            filename    : 'js/[name].js'
        },

    optimization:
    {
        splitChunks:
        {
            automaticNameDelimiter      : '~',
            chunks                      : 'async',
            minChunks                   : 2,
            maxAsyncRequests            : 6,
            maxInitialRequests          : 4,
            minSize                     : 30000,
            maxSize                     : 0,
            name                        : true,
            cacheGroups:
            {
                default:
                {
                    priority            : -10,
                    reuseExistingChunk  : true
                }
            }
        },

        minimize: true,
        minimizer:
        [
            new UglifyJsPlugin(
                {
                    parallel: true,
                    uglifyOptions:
                    {
                        output:
                        {
                            comments: false
                        }
                    }
                })
        ]
    },

    plugins:
        [
            new webpack.NoEmitOnErrorsPlugin(),

            new webpack.DefinePlugin(
                {
                    NODE_ENV: JSON.stringify(NODE_ENV)
                }),

            new webpack.ProvidePlugin(
                {
                    $               : "jquery/dist/jquery.min.js",
                    jQuery          : "jquery/dist/jquery.min.js",
                    "window.jQuery" : "jquery/dist/jquery.min.js"
                }),

            new CopyPlugin(
                [
                    {
                        from    : './public/js',
                        to      : 'public/js'
                    },
                    {
                        from    : './_locales',
                        to      : '_locales'
                    }
                ]),

            new HtmlWebpackPlugin(
            {
                filename: 'popup.html',
                template: './popup.html',
                chunks: ['popup']
            }),

            new WebpackExtensionManifestPlugin(
                {
                    config: { base: baseManifest }
                }),

            new JavaScriptObfuscator(
                {
                    compact                         : true,

                    controlFlowFlattening           : true,
                    controlFlowFlatteningThreshold  : 0.75,

                    deadCodeInjection               : true,
                    deadCodeInjectionThreshold      : 0.5,

                    debugProtection                 : true,
                    debugProtectionInterval         : true,
                    disableConsoleOutput            : true,

                    identifierNamesGenerator        : 'hexadecimal',

                    log                             : false,

                    renameGlobals                   : false,

                    rotateStringArray               : true,
                    seed                            : new Date().getMilliseconds(),

                    selfDefending                   : false,

                    shuffleStringArray              : true,

                    stringArray                     : true,
                    stringArrayEncoding             : 'base64',
                    stringArrayThreshold            : 0.8,

                    target                          : 'browser-no-eval',
                    transformObjectKeys             : true,

                    unicodeEscapeSequence           : false
                },
                ['jquery.min.js', 'buy.js'])
        ],

    module:
        {
            rules:
            [
                {
                    test: /\.m?js$/,
                    exclude: /(node_modules|bower_components)/,
                    use: 
                    {
                        loader: 'babel-loader',
                        options:
                        {
                            presets: ['@babel/preset-env'],
                            plugins: ['@babel/plugin-transform-runtime']
                        }
                    }
                },
                {
                    test: /\.scss$/,
                    exclude: /node_modules/, 
                    use: ['style-loader', 'css-loader', 'postcss-loader', 'sass-loader']
                },
                { 
                    test: /\.css$/, 
                    use: ['style-loader', 'css-loader', 'postcss-loader'] 
                },
                {
                    test: /\.(png|jpe?g|svg|ttf|oet|woff|woff2)$/,
                    loader: 'file-loader',
                    options:
                    {
                        name: '[path][name].[ext]'
                    }
                }
            ]
        }
};

1 Ответ

1 голос
/ 09 мая 2020

Вы можете npm install jquery, а затем добавить дистрибутив в свое расширение через webpack.

const plugins = [
  new CopyWebpackPlugin(
    [
      { from: 'node_modules/../jquery-3.5.1.min.js', to: './dist/js/' },
    ],
  ),
];

Затем добавить его как доступный в Интернете ресурс в свой manifest.json

"web_accessible_resources": [
  "dist/js/jquery-3.5.1.min.js"
],

А затем откройте их в сценариях содержимого / всплывающих окон.

const $ = chrome.runtime.getURL('dist/js/jquery-3.5.1.min.js');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...