Відповіді:
Є кілька способів наблизитись до глобальних:
Webpack оцінює модулі лише один раз, тому ваш примірник залишається глобальним і здійснює зміни від модуля до модуля. Отже, якщо ви створюєте щось на кшталт a globals.js
і експортуєте об'єкт усіх своїх глобальних тонів, ви можете import './globals'
і читати / писати в ці глобалі. Ви можете імпортувати в один модуль, вносити зміни до об'єкта з функції та імпортувати в інший модуль і читати ці зміни у функції. Також пам’ятайте про порядок того, що відбувається. Вебпакет спочатку візьме весь імпорт і завантажить їх, щоб розпочати з вашого entry.js
. Тоді воно виконає entry.js
. Тож там, де ви читаєте / пишете в глобальних мережах, важливо. Це з кореневої області модуля або у функції, названій пізніше?
Примітка . Якщо ви хочете, щоб екземпляр був new
кожен раз, тоді використовуйте клас ES6 . Традиційно в JS ви використовуєте великі регістри класів (на відміну від малих літер для об'єктів)
import FooBar from './foo-bar' // <-- Usage: myFooBar = new FooBar()
Ось як це можна зробити за допомогою ProvidePlugin Webpack (який робить модуль доступним як змінну у кожному модулі та лише ті модулі, де ви його фактично використовуєте). Це корисно, коли ви не хочете продовжувати друкувати import Bar from 'foo'
знову і знову. Або ви можете принести сюди такий пакет, як jQuery, або lodash як глобальний (хоча ви можете поглянути на зовнішні програми Webpack ).
Крок 1) Створіть будь-який модуль. Наприклад, глобальний набір утиліт був би корисним:
utils.js
export function sayHello () {
console.log('hello')
}
Крок 2) Псевдонім модуля та додайте до ProvidePlugin:
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-файл, і він повинен працювати. Переконайтеся, що перезавантажте сервер розробників, якщо ви використовуєте це з Webpack.
Примітка. Не забудьте розповісти вашому літеру про глобальний, щоб він не скаржився. Наприклад, дивіться мою відповідь на ESLint тут .
Якщо ви просто хочете використовувати const зі значеннями рядків для своїх глобальних, ви можете додати цей плагін до свого списку плагінів Webpack:
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, якщо є якісь ключі / облікові дані) та додасть ваші змінні конфігурації до об'єкта Node.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 , використовуйте її, якщо ви хочете виключити включення деяких модулів до складу вбудованого пакета. Webpack зробить модуль глобально доступним, але не поставить його у свій пакет. Це зручно для великих бібліотек, таких як jQuery (оскільки струшування дерев зовнішніми пакетами не працює в Webpack ), де вони завантажені на вашу сторінку вже в окремих тегах сценарію (можливо, з CDN).
externals
замість цього, якщо вам потрібно створити глобальну змінну. Приклад: externals: { 'webpackVariables': `{ serverUrl: '${ env.server }', cordovaBuild: '${ env.cordova }', }`, },
Потім використовуйте його якconst webpackVariables = require('webpackVariables');
declare const isProduction: bool;
Для довідки, перевірити це typescriptlang.org/docs/handbook/declaration-files/templates / ...
Я збирався задати саме таке питання. Провівши трохи далі та переглянувши частину документації веб-пакету, я думаю, що ви хочете, це output.library
і output.libraryTarget
у webpack.config.js
файлі.
Наприклад:
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 .
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
не було визначено. Нарешті я виявив, що webpack (досить розумно) включає модуль лише у тому випадку, якщо його простір імен посилається хоча б один раз. Тому, коли я зробив передмову з однією з функцій утиліти цільового файлуutils
, модуль був включений.