जवाबों:
ग्लोबल्स से संपर्क करने के कई तरीके हैं:
वेबपैक केवल एक बार मॉड्यूल का मूल्यांकन करता है, इसलिए आपका उदाहरण वैश्विक रहता है और मॉड्यूल से मॉड्यूल के माध्यम से परिवर्तन करता है। इसलिए यदि आप कुछ ऐसा बनाते हैं globals.js
और अपने सभी ग्लोबल्स का ऑब्जेक्ट निर्यात करते हैं तो आप import './globals'
इन ग्लोबल्स को पढ़ और लिख सकते हैं। आप एक मॉड्यूल में आयात कर सकते हैं, एक फ़ंक्शन से ऑब्जेक्ट में परिवर्तन कर सकते हैं और दूसरे मॉड्यूल में आयात कर सकते हैं और एक फ़ंक्शन में उन परिवर्तनों को पढ़ सकते हैं। यह भी याद रखें कि आदेश होता है। वेबपैक सबसे पहले सभी आयातों को ले जाएगा और उन्हें आपके क्रम में शुरू करने के लिए लोड करेगा entry.js
। फिर इस पर अमल करेंगे entry.js
। इसलिए जहां आप ग्लोबल्स को पढ़ते / लिखते हैं, वह महत्वपूर्ण है। क्या यह किसी मॉड्यूल के रूट स्कोप से है या बाद में किसी फ़ंक्शन में है?
नोट : यदि आप चाहते हैं कि उदाहरण new
हर बार हो, तो ES6 वर्ग का उपयोग करें । परंपरागत रूप से जेएस में आप कक्षाओं को कैपिटलाइज़ करेंगे (जैसा कि वस्तुओं के निचले हिस्से के विपरीत) जैसे
import FooBar from './foo-bar' // <-- Usage: myFooBar = new FooBar()
यहां बताया गया है कि आप वेबपैक के प्रोप्लुगिन का उपयोग करके कैसे कर सकते हैं (जो प्रत्येक मॉड्यूल में एक चर के रूप में एक मॉड्यूल उपलब्ध कराता है और केवल उन मॉड्यूल जहां आप वास्तव में इसका उपयोग करते हैं)। यह तब उपयोगी होता है जब आप import Bar from 'foo'
बार-बार टाइपिंग नहीं करना चाहते हैं । या आप यहां jQuery या लॉश जैसे पैकेज में ग्लोबल के रूप में ला सकते हैं (हालांकि आप वेबपैक के एक्सटर्नल पर एक नज़र डाल सकते हैं )।
चरण 1) कोई भी मॉड्यूल बनाएं। उदाहरण के लिए, उपयोगिताओं का एक वैश्विक सेट उपयोगी होगा:
utils.js
export function sayHello () {
console.log('hello')
}
चरण 2) उपनाम को जोड़ दें और ProvPlugin में जोड़ें:
webpack.config.js
var webpack = require("webpack");
var path = require("path");
// ...
module.exports = {
// ...
resolve: {
extensions: ['', '.js'],
alias: {
'utils': path.resolve(__dirname, './utils') // <-- When you build or restart dev-server, you'll get an error if the path to your utils.js file is incorrect.
}
},
plugins: [
// ...
new webpack.ProvidePlugin({
'utils': 'utils'
})
]
}
अब बस utils.sayHello()
किसी भी js फ़ाइल में कॉल करें और यह काम करना चाहिए। सुनिश्चित करें कि आप अपने देव-सर्वर को पुनः आरंभ करते हैं यदि आप वेबपैक के साथ उसका उपयोग कर रहे हैं।
नोट: अपने लिंटर को ग्लोबल के बारे में बताना न भूलें, इसलिए यह शिकायत नहीं करेगा। उदाहरण के लिए, यहां ESLint के लिए मेरा जवाब देखें ।
यदि आप अपने ग्लोबल्स के लिए स्ट्रिंग मान के साथ कास्ट का उपयोग करना चाहते हैं, तो आप इस प्लगइन को अपनी वेबपैक प्लगइन्स की सूची में जोड़ सकते हैं:
new webpack.DefinePlugin({
PRODUCTION: JSON.stringify(true),
VERSION: JSON.stringify("5fa3b9"),
BROWSER_SUPPORTS_HTML5: true,
TWO: "1+1",
"typeof window": JSON.stringify("object")
})
इसका उपयोग करें जैसे:
console.log("Running App version " + VERSION);
if(!BROWSER_SUPPORTS_HTML5) require("html5shiv");
window.foo = 'bar' // For SPA's, browser environment.
global.foo = 'bar' // Webpack will automatically convert this to window if your project is targeted for web (default), read more here: https://webpack.js.org/configuration/node/
आप इसे आमतौर पर पॉलीफ़िल के लिए उपयोग करते देखेंगे, उदाहरण के लिए: window.Promise = Bluebird
(सर्वर साइड प्रोजेक्ट्स के लिए) dotenv पैकेज एक स्थानीय कॉन्फ़िगरेशन फ़ाइल लेगा (जिसे आप अपनी .gitignore में जोड़ सकते हैं यदि कोई कुंजी / क्रेडेंशियल्स हैं) और नोड के प्रोसेस के लिए अपने कॉन्फ़िगरेशन चर जोड़ता है ।env ऑब्जेक्ट।
// As early as possible in your application, require and configure dotenv.
require('dotenv').config()
.env
अपने प्रोजेक्ट के रूट डायरेक्टरी में एक फाइल बनाएं । के रूप में नई लाइनों पर पर्यावरण-विशिष्ट चर जोड़ें NAME=VALUE
। उदाहरण के लिए:
DB_HOST=localhost
DB_USER=root
DB_PASS=s1mpl3
बस।
process.env
अब आपके पास आपकी .env
फ़ाइल में परिभाषित की गई कुंजियाँ और मूल्य हैं ।
var db = require('db')
db.connect({
host: process.env.DB_HOST,
username: process.env.DB_USER,
password: process.env.DB_PASS
})
वेबपैक के एक्सटर्नल के संबंध में , इसका उपयोग करें यदि आप कुछ मॉड्यूल को अपने निर्मित बंडल में शामिल करने से बाहर करना चाहते हैं। Webpack मॉड्यूल को विश्व स्तर पर उपलब्ध कराएगा लेकिन इसे आपके बंडल में नहीं डालेगा। यह jQuery जैसे बड़े पुस्तकालयों के लिए आसान है (क्योंकि ट्री पैकेज में बाहरी पैकेज हिलाना वेबपैक में काम नहीं करता है ) जहां आपके पास ये पृष्ठ पहले से ही अलग स्क्रिप्ट टैग (शायद सीडीएन से) में लोड किए गए हैं।
externals
यदि आपको वैश्विक वैरिएबल बनाने की आवश्यकता है, तो इसके बजाय उपयोग करें । उदाहरण: externals: { 'webpackVariables': `{ serverUrl: '${ env.server }', cordovaBuild: '${ env.cordova }', }`, },
इसके बाद इसका उपयोग करेंconst webpackVariables = require('webpackVariables');
declare const isProduction: bool;
संदर्भ के लिए, इस प्रकार की
मैं एक ही सवाल पूछने वाला था। थोड़ा आगे खोज और webpack के प्रलेखन का हिस्सा decyphering के बाद मुझे लगता है कि क्या आप चाहते हैं है output.library
और output.libraryTarget
में webpack.config.js
फ़ाइल।
उदाहरण के लिए:
जे एस / index.js:
var foo = 3;
var bar = true;
webpack.config.js
module.exports = {
...
entry: './js/index.js',
output: {
path: './www/js/',
filename: 'index.js',
library: 'myLibrary',
libraryTarget: 'var'
...
}
अब अगर आप www/js/index.js
html स्क्रिप्ट टैग में जेनरेट की गई फाइल को लिंक करते हैं तो आप myLibrary.foo
अपनी अन्य स्क्रिप्ट्स में कहीं से भी एक्सेस कर सकते हैं।
export { foo }
है index.js
?
DefinePlugin का उपयोग करें ।
डेफिनप्लगिन आपको वैश्विक स्थिरांक बनाने की अनुमति देता है जिसे संकलन समय पर कॉन्फ़िगर किया जा सकता है।
new webpack.DefinePlugin(definitions)
plugins: [
new webpack.DefinePlugin({
PRODUCTION: JSON.stringify(true)
})
//...
]
console.log(`Environment is in production: ${PRODUCTION}`);
आप डिफाइन का उपयोग कर सकते हैं window.myvar = {}
। जब आप इसका उपयोग करना चाहते हैं, तो आप जैसे चाहें उपयोग कर सकते हैंwindow.myvar = 1
var window.CKEDITOR_BASEPATH = {};
त्रुटि उत्पन्न करता है "अनपेक्षित टोकन" के बादwindow.
var
कीवर्ड करना चाहिए । window.CKEDITOR_BASEPATH = {};
utils
लक्ष्य फ़ाइल में अपने स्वयं के नामस्थान का कोई संदर्भ शामिल नहीं किया था - शुरू में मैंने केवल ब्राउज़र में एक ब्रेकपॉइंट डाला था स्रोत विंडो और मैंutils
परिभाषित क्यों नहीं था पर puzzling रखा । अंत में मुझे पता चला कि वेबपैक (बल्कि स्मार्टली) में केवल एक मॉड्यूल शामिल है अगर इसके नाम स्थान को कम से कम एक बार संदर्भित किया जाता है। इसलिए, एक बार जब मैंने लक्ष्य फ़ाइल की उपयोगिता कार्यों में से एक को प्रस्तुत कियाutils
, तो मॉड्यूल शामिल था ।