เป็นไปได้ไหมที่จะกำหนดตัวแปรส่วนกลางด้วย webpack เพื่อให้ได้ผลลัพธ์ดังนี้:
var myvar = {};
ตัวอย่างทั้งหมดที่ฉันเห็นใช้ไฟล์ภายนอก require("imports?$=jquery!./file.js")
เป็นไปได้ไหมที่จะกำหนดตัวแปรส่วนกลางด้วย webpack เพื่อให้ได้ผลลัพธ์ดังนี้:
var myvar = {};
ตัวอย่างทั้งหมดที่ฉันเห็นใช้ไฟล์ภายนอก require("imports?$=jquery!./file.js")
คำตอบ:
มีหลายวิธีในการเข้าใกล้โลก:
Webpack จะประเมินโมดูลเพียงครั้งเดียวดังนั้นอินสแตนซ์ของคุณจึงยังคงเป็นสากลและดำเนินการเปลี่ยนแปลงจากโมดูลไปยังโมดูล ดังนั้นหากคุณสร้างบางสิ่งเช่นglobals.js
และส่งออกวัตถุของโลกทั้งหมดของคุณคุณก็สามารถimport './globals'
อ่าน / เขียนไปยังโลกเหล่านี้ได้ คุณสามารถนำเข้าในโมดูลเดียวทำการเปลี่ยนแปลงวัตถุจากฟังก์ชันและนำเข้าสู่โมดูลอื่นและอ่านการเปลี่ยนแปลงเหล่านั้นในฟังก์ชัน นอกจากนี้ยังจำคำสั่งซื้อที่เกิดขึ้น Webpack จะนำเข้าทั้งหมดก่อนและโหลดขึ้นตามลำดับโดยเริ่มต้นในentry.js
ไฟล์. entry.js
จากนั้นก็จะดำเนินการ ดังนั้นตำแหน่งที่คุณอ่าน / เขียนถึงคนทั่วโลกจึงมีความสำคัญ มาจากขอบเขตรากของโมดูลหรือในฟังก์ชันที่เรียกในภายหลังหรือไม่?
หมายเหตุ : หากคุณต้องการเช่นที่จะเป็นnew
ทุกครั้งที่แล้วใช้ระดับ ES6 ตามเนื้อผ้าใน JS คุณจะใช้ตัวพิมพ์ใหญ่ในชั้นเรียน (เมื่อเทียบกับตัวพิมพ์เล็กสำหรับวัตถุ) เช่น
import FooBar from './foo-bar' // <-- Usage: myFooBar = new FooBar()
ต่อไปนี้เป็นวิธีที่คุณสามารถทำได้โดยใช้ GivePlugin ของ Webpack (ซึ่งทำให้โมดูลพร้อมใช้งานเป็นตัวแปรในทุกโมดูลและเฉพาะโมดูลที่คุณใช้งานจริง) สิ่งนี้มีประโยชน์เมื่อคุณไม่ต้องการพิมพ์import Bar from 'foo'
ซ้ำแล้วซ้ำอีก หรือคุณสามารถนำแพ็คเกจเช่น jQuery หรือ lodash เป็น global ได้ที่นี่ (แม้ว่าคุณจะดูExternalsของ Webpack )
ขั้นตอนที่ 1) สร้างโมดูลใด ๆ ตัวอย่างเช่นชุดยูทิลิตี้ส่วนกลางจะสะดวก:
utils.js
export function sayHello () {
console.log('hello')
}
ขั้นตอนที่ 2) ตั้งชื่อโมดูลและเพิ่มลงใน GivePlugin:
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 ใดก็ได้และควรใช้งานได้ ตรวจสอบให้แน่ใจว่าคุณรีสตาร์ทเซิร์ฟเวอร์ dev ของคุณหากคุณใช้กับ Webpack
หมายเหตุ: อย่าลืมบอกคนของคุณเกี่ยวกับคนทั่วโลกจะได้ไม่บ่น ตัวอย่างเช่นดูฉันตอบสำหรับ ESLint ที่นี่
หากคุณต้องการใช้ const กับค่าสตริงสำหรับ globals ของคุณคุณสามารถเพิ่มปลั๊กอินนี้ในรายการปลั๊กอิน 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/
คุณจะเห็นสิ่งนี้ที่ใช้กันทั่วไปสำหรับ polyfills ตัวอย่างเช่น: window.Promise = Bluebird
(สำหรับโปรเจ็กต์ฝั่งเซิร์ฟเวอร์) แพ็กเกจ dotenv จะใช้ไฟล์คอนฟิกูเรชันภายในเครื่อง (ซึ่งคุณสามารถเพิ่มลงใน. gitignore ของคุณได้หากมีคีย์ / ข้อมูลรับรอง) และเพิ่มตัวแปรคอนฟิกูเรชันของคุณไปยังอ็อบเจ็กต์ process.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
})
เกี่ยวกับExternalsของ 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/…
ฉันกำลังจะถามคำถามเดียวกันนี้ หลังจากค้นหาเพิ่มเติมและถอดรหัสส่วนหนึ่งของเอกสารของ webpack ฉันคิดว่าสิ่งที่คุณต้องการคือ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
?
window.myvar = {}
คุณสามารถใช้กำหนด ต้องการใช้เมื่อใดก็สามารถใช้ likewindow.myvar = 1
var window.CKEDITOR_BASEPATH = {};
ข้อผิดพลาดคือ "โทเค็นที่ไม่คาดคิด" หลังจากwindow.
var
คีย์เวิร์ด window.CKEDITOR_BASEPATH = {};
ฉันแก้ไขปัญหานี้โดยการตั้งค่าตัวแปรส่วนกลางเป็นคุณสมบัติคงที่ในคลาสที่เกี่ยวข้องมากที่สุด ใน ES5 จะมีลักษณะดังนี้:
var Foo = function(){...};
Foo.globalVar = {};
utils
เนมสเปซของตัวเองในไฟล์เป้าหมาย - ตอนแรกฉันเพิ่งใส่เบรกพอยต์ในเบราว์เซอร์ หน้าต่างแหล่งที่มาและฉันยังคงงงว่าทำไมutils
ไม่ได้กำหนดไว้ ในที่สุดฉันก็ค้นพบว่า webpack (ค่อนข้างฉลาด) มีเฉพาะโมดูลหากมีการอ้างอิงเนมสเปซอย่างน้อยหนึ่งครั้ง ดังนั้นเมื่อฉันได้นำหน้าหนึ่งในฟังก์ชันยูทิลิตี้ของไฟล์เป้าหมายไปด้วยutils
โมดูลก็จะรวม