Quero expor o objeto jQuery ao objeto de janela global que pode ser acessado dentro do console do desenvolvedor no navegador. Agora, na configuração do meu webpack, tenho as seguintes linhas:
plugins: [
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery'
})
]
Essas linhas adicionam as definições jQuery a cada arquivo em meus módulos do webpack. Mas quando eu construo o projeto e tento acessar o jQuery no console do desenvolvedor assim:
window.$;
window.jQuery;
diz que essas propriedades são indefinidas ...
Existe uma maneira de corrigir isso?
javascript
jquery
webpack
Ferbolg
fonte
fonte
this: 'window'
também? Como muitas bibliotecas assumem que athis
variável é o objeto WindowRespostas:
Você precisa usar o carregador de exposição .
Você pode fazer isso quando precisar:
ou você pode fazer isso em sua configuração:
ATUALIZAÇÃO : a partir do webpack 2, você precisa usar expose -loader em vez de expor :
fonte
ProvidePlugin
deve ser usado principalmente em situações em que bibliotecas de terceiros dependem da presença de uma variável global.{test: /jquery\.js$/, loader: 'expose?jQuery!expose?$'}
$ = require('jquery'); window.jQuery = $; window.$ = $;
? (não é necessárioexpose-loader
)module: { rules: [{ test: require.resolve('jquery'), use: [{ loader: 'expose-loader', options: 'jQuery' },{ loader: 'expose-loader', options: '$' }] }] }
. Esta é a única maneira de expor o jQuery e está usando a nova sintaxe module.rules .O ProvidePlugin substitui um símbolo em outra fonte por meio da respectiva importação, mas não expõe o símbolo no namespace global. Um exemplo clássico são os plug-ins jQuery. A maioria deles espera
jQuery
ser definida globalmente. Com o,ProvidePlugin
você se certificaria de que o jQuery é uma dependência (por exemplo, carregado antes) e a ocorrência dejQuery
em seu código seria substituída pelo equivalente bruto do webpackrequire('jquery')
.Se você tiver scripts externos que dependem do símbolo para estar no namespace global (como digamos um JS hospedado externamente, chamadas de Javascript no Selenium ou simplesmente acessando o símbolo no console do navegador), você deseja usar o
expose-loader
.Resumindo: o ProvidePlugin gerencia dependências de tempo de construção para símbolos globais, enquanto
expose-loader
gerencia dependências de tempo de execução para símbolos globais.fonte
Parece que o
window
objeto está exposto em todos os módulos.Por que não apenas importar / exigir
JQuery
e colocar:Você precisará garantir que isso aconteça antes de solicitar / importar qualquer módulo que faz uso
window.JQuery
, seja em um módulo de exigência ou no módulo onde está sendo usado.fonte
require
não éimport
JQuery
.import
, você pode obter erro, porqueimport
s são classificados no início do arquivo erequire
permanecem onde foram colocados. Portanto, a ordem de execução só mudaimport
quando a variável da janela não está definida.Isso sempre funcionou para mim. incluindo para webpack 3
window.$ = window.jQuery = require("jquery");
fonte
Nenhuma das opções acima funcionou para mim. (e eu realmente não gosto da sintaxe expose-loader). Em vez de,
Eu adicionei a webpack.config.js:
Todos os módulos têm acesso através do jQuery através de $.
Você pode expô-lo na janela adicionando o seguinte a qualquer um de seus módulos agrupados por webpack:
fonte
Atualização para Webpack v2
Instale o expose-loader conforme descrito por Matt Derrick:
Em seguida, insira o seguinte snippet em
webpack.config.js
:(dos documentos expose-loader )
fonte
window.jQuery = require('jquery');
No meu caso funciona
fonte