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.