Webpack을 사용하여 jQuery를 실제 Window 개체에 노출


111

브라우저의 개발자 콘솔 내에서 액세스 할 수있는 전역 창 개체에 jQuery 개체를 노출하고 싶습니다. 이제 내 webpack 구성에 다음 줄이 있습니다.

plugins: [
                new webpack.ProvidePlugin({
                    $: 'jquery',
                    jQuery: 'jquery'
                })
            ]

이 줄은 내 웹팩 모듈의 각 파일에 jQuery 정의를 추가합니다. 그러나 프로젝트를 빌드하고 다음과 같이 개발자 콘솔에서 jQuery에 액세스하려고 할 때 :

window.$;
window.jQuery;

이 속성이 정의되지 않았다고합니다 ...

이 문제를 해결할 방법이 있습니까?


1
나도 설정할 수 있습니까 this: 'window'? 많은 도서관이 가정 때문에 this변수 창 객체가 될 수 있습니다
— Abhinav 신기

답변:


129

expose-loader 를 사용해야합니다 .

npm install expose-loader --save-dev

필요한 경우 다음 중 하나를 수행 할 수 있습니다.

require("expose?$!jquery");

또는 구성에서 다음을 수행 할 수 있습니다.

loaders: [
    { test: require.resolve('jquery'), loader: 'expose?jQuery!expose?$' }
]

UPDATE :로 웹팩 2, 당신은 사용할 필요가 노출 로더를 대신 노출 :

module: {
    rules: [{
        test: require.resolve('jquery'),
        use: [{
            loader: 'expose-loader',
            options: '$'
        }]
    }]
}

11
는 ProvidePlugin타사 라이브러리는 전역 변수의 존재에 의존하는 경우 주로 경우에 사용한다.
— Johannes Ewald 2015 년

나는 질문이 :)이 내가 온라인을 많이 보았다 '게으른'을 위해 플러그인을 제공하지만 올바른 사용 된 잘못된 가정했다
— 매트 데릭

8
이것이 바로 제가 찾던 것입니다. 로더의 경우 한 줄로도 추가 할 수 있습니다.{test: /jquery\.js$/, loader: 'expose?jQuery!expose?$'}
— Fernando

8
첫 번째 스크립트를 추가 할 수 없습니까 $ = require('jquery'); window.jQuery = $; window.$ = $;? (필요하지 expose-loader)
— 허먼

1
받는 따르면 노출 로더 GitHub의 페이지 웹팩 2 문법은 다음이다 : module: { rules: [{ test: require.resolve('jquery'), use: [{ loader: 'expose-loader', options: 'jQuery' },{ loader: 'expose-loader', options: '$' }] }] }. 이것이 내가 jQuery를 노출시킬 수있는 유일한 방법이며 새로운 module.rules 구문을 사용하고 있습니다.
— Gavin Sutherland

84

ProvidePlugin은 각각의 가져 오기를 통해 다른 소스의 심볼을 대체하지만 전역 네임 스페이스의 심볼을 노출하지 않습니다. 고전적인 예는 jQuery 플러그인입니다. 대부분은 jQuery전역 적으로 정의 되기를 기대 합니다. 를 사용하면 ProvidePluginjQuery가 종속성 (예 : 이전에로드 됨)인지 확인 jQuery하고 코드에서 의 발생 이 require('jquery').

심볼에 의존하는 외부 스크립트가 전역 네임 스페이스에있는 경우 (예 : 외부에서 호스팅 된 JS, 자바 스크립트가 Selenium에서 호출하거나 단순히 브라우저의 콘솔에서 심볼에 액세스하는 경우) expose-loader대신 을 사용하고 싶습니다 .

간단히 말해서, ProvidePlugin은 전역 심볼에 대한 빌드 타임 종속성을 expose-loader관리 하는 반면은 전역 심볼에 대한 런타임 종속성을 관리합니다.


2
설명을 주셔서 감사합니다
— FOTON

공식 문서에서 웹팩으로 예를 ProvidePlugin : webpack.js.org/plugins/provide-plugin/#usage-jquery
— 제임스 씨족

33

window객체가 모든 모듈에 노출 된 것 같습니다 .

그냥 가져 오기 / 요구 JQuery하고 넣지 않는 이유 :

window.$ = window.JQuery = JQuery;

window.JQuery필요한 모듈이나 사용중인 모듈에서를 사용하는 모듈을 요청 / 가져 오기 전에이 문제가 발생하는지 확인해야합니다 .


새로운 종속성을 추가하지 않고 가장 쉬운 솔루션. 감사!
— fatihpense 2011

변수를 사용하는 다른 중첩 모듈에서는 작동하지 않습니다. '정의되지 않음'
— aboutqx

4
사용할 때 잘 작동 require동안하지import
— aboutqx

@aboutqx 무슨 뜻인지 잘 모르겠습니다. 내 대답은 JQuery가 이미 가져 오기 / 필수적이며라는 변수에 할당되었다고 가정했습니다 JQuery.
— mhess

2
@mhess를 사용할 때 s가 파일의 맨 위로 정렬되고 파일 이 놓인 곳에 머물러 import있기 때문에 오류가 발생할 수 있습니다 . 따라서 실행 순서 는 창 변수가 설정되지 않은 경우 에만 변경됩니다 . importrequireimport
— aboutqx

16

이것은 항상 나를 위해 일했습니다. 대한 포함 웹팩 3 window.$ = window.jQuery = require("jquery");


2
최고의 솔루션! 2018
— waza123

6

위의 어느 것도 나를 위해 일하지 않았습니다. (그리고 노출 로더 구문이 정말 마음에 들지 않습니다). 대신

webpack.config.js에 추가했습니다.

var webpack = require('webpack');
module.exports = {
   plugins: [
       new webpack.ProvidePlugin({
           $: 'jquery',
       })     
   ]
}

모든 모듈은 $를 통해 jQuery를 통해 액세스 할 수 있습니다.

webpack에 번들로 제공되는 모듈에 다음을 추가하여 창에 노출 할 수 있습니다.

window.$ = window.jQuery = $

1
이것은 장면 뒤에서 webpack-stream을 사용하여 저를 위해 일했습니다
— klewis

1

Webpack v2 업데이트

Matt Derrick이 설명한대로 노출 로더 를 설치합니다 .

npm install expose-loader --save-dev

그런 다음에 다음 스 니펫을 삽입하십시오 webpack.config.js.

module.exports = {
    entry: {
        // ...
    },
    output: {
        // ...
    },
    module: {
        loaders: [
                { test: require.resolve("jquery"), loader: "expose-loader?$!expose-loader?jQuery" }
        ]
    }
};

( expose-loader 문서에서 )


이제 더 이상 Webpack의 모든 버전에서이 작업을 수행 할 수 없습니다. 무엇이 변경되었는지 확실하지 않지만 jQuery 또는 $를 인식 할 수있는 유일한 방법은 수행하는 것입니다window.jQuery = require('jquery');
— trpt4him

0

내 경우에는 작동합니다.

{ test: require.resolve("jquery"), loader: "expose?$!expose?jQuery" } 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.