웹팩으로 전역 변수 정의
웹팩을 사용하여 전역 변수를 정의하여 다음과 같은 결과를 얻을 수 있습니까?
var myvar = {};
가 본 이었습니다를 한 것들이었습니다.require("imports?$=jquery!./file.js")
글로벌에 접근하는 데는 여러 가지 방법이 있습니다.
1. 변수를 모듈에 넣습니다.
웹팩은 모듈을 한 번만 평가하므로 인스턴스는 전역적인 상태를 유지하고 모듈 간에 변경 사항을 전달합니다.그래서 만약 당신이 무언가를 만든다면,globals.js
전역의 개체를 다할 수 .import './globals'
그리고 이 글로벌에 읽기/쓰기를 합니다.한 모듈로 가져올 수 있고, 함수에서 개체를 변경할 수 있으며 다른 모듈로 가져올 수 있으며 함수에서 변경된 내용을 읽을 수 있습니다.또한 일이 일어나는 순서를 기억하세요.할 것입니다.entry.js
실행됩니다. 됩니다.entry.js
읽기 따라서 글로벌에 대한 읽기/쓰기가 중요합니다.모듈의 루트 범위에서 인가요, 아니면 나중에 호출되는 함수에서 인가요?
config.js
export default {
FOO: 'bar'
}
somefile.js
import CONFIG from './config.js'
console.log(`FOO: ${CONFIG.FOO}`)
참고: 인스턴스를 다음과 같이 하려면new
매번 ES6 클래스를 사용합니다.전통적으로 JS에서는 (객체의 경우 소문자와 반대로) 클래스를 대문자로 사용합니다.
import FooBar from './foo-bar' // <-- Usage: myFooBar = new FooBar()
2. 웹팩의 제공 플러그인을 사용합니다.
다음은 웹팩의 ProvidPlugin(모든 모듈에서 모듈을 변수로 사용할 수 있게 하고 실제로 사용하는 모듈만 사용할 수 있게 함)을 사용하여 이를 수행하는 방법입니다. 때 유용합니다.import Bar from 'foo'
몇 번이고또는 jQuery나 lodash와 같은 패키지를 글로벌 버전으로 가져올 수도 있습니다(Webpack의 Externals를 볼 수도 있지만).
1단계. 모듈을 만듭니다.예를 들어, 글로벌 유틸리티 세트가 유용합니다.
utils.js
export function sayHello () {
console.log('hello')
}
2단계. 모듈의 별칭을 지정하고 ProvidPlugin에 추가합니다.
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과 함께 dev-server를 사용하는 경우에는 dev-server를 재시작해야 합니다.
참고: 불평하지 않도록 전세계에 대해 편지에 말하는 것을 잊지 마세요.예를 들어, ESLint에 대한 제 답변을 여기서 보세요.
3. 웹팩의 DefinePlugin을 사용합니다.
전역에 문자열 값이 있는 const를 사용하려면 이 플러그인을 웹팩 플러그인 목록에 추가하면 됩니다.
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");
4. 전역 창 개체(또는 노드의 전역)를 사용합니다.
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
5. dotenv와 같은 패키지를 사용합니다.
(서버측 프로젝트의 경우)dotenv 패키지는 로컬 구성 파일(key/credential이 있는 경우 .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
})
메모들
웹팩의 외부 기능과 관련하여 일부 모듈을 빌드 번들에 포함하지 않도록 하려면 이 기능을 사용합니다.웹팩은 모듈을 전세계적으로 사용할 수 있게 해주지만, 당신의 번들에는 넣지 않습니다.이것은 (아마도 CDN에서) 별도의 스크립트 태그에 이미 페이지에 로드되어 있는 jQuery(트리 쉐이킹 외부 패키지가 웹팩에서 작동하지 않기 때문에)와 같은 큰 라이브러리에 유용합니다.
저는 바로 그 질문을 하려고 했습니다.조금 더 검색해보고 웹팩의 문서의 일부를 암호 해독해보니 당신이 원하는 것은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
당신의 다른 스크립트 어디에서나 볼 수 있습니다.
플러그인 정의을 사용합니다.
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
DefinePlugin은 실제로는 아무것도 정의하지 않습니다.이것은 번들 코드에 존재하는 변수를 대체하는 것입니다.코드에 변수가 없으면 아무 소용이 없습니다.그래서 글로벌 변수를 만들지 않습니다.
전역 변수를 생성하려면 코드에 다음과 같이 입력합니다.
window.MyGlobal = MY_GLOBAL;
대신 DefinePlugin을 사용합니다.MY_GLOBAL
코드가 있습니다.
new webpack.DefinePlugin({
'MY_GLOBAL': `'foo'`,
// or
'MY_GLOBAL': `Math.random()`,
}),
그러면 출력 JS는 다음과 같습니다.
window.MyGlobal = 'foo';
// or
window.MyGlobal = Math.random();
그렇지만MY_GLOBAL
런타임에 실제로는 존재하지 않습니다. 정의되지 않았기 때문입니다.그래서 DefinePlugin이 오해의 소지가 있는 이름을 가지고 있습니다.
일부 오래된 프로젝트에서 번들 < 스크립트 > 태그 js 파일을 시도할 때 이 문제가 발생할 수 있습니다.웹팩을 사용하지 마십시오. jquery와 같은 50개 이상의 라이브러리에 가입한 후 모든 전역 변수를 파악하거나 중첩된 변수를 사용하는 경우에도 불가능할 수 있습니다.2개의 명령어에서 이 모든 문제를 삭제하는 대신 단순히 ugulify js를 사용하는 것이 좋습니다.
npm install uglify-js -g
uglifyjs --compress --mangle --output bundle.js -- js/jquery.js js/silly.js
저는 글로벌 변수를 가장 관련성이 높은 클래스의 정적 속성으로 설정하여 이 문제를 해결했습니다.ES5에서는 다음과 같이 나타납니다.
var Foo = function(){...};
Foo.globalVar = {};
언급URL : https://stackoverflow.com/questions/37656592/define-global-variable-with-webpack
'programing' 카테고리의 다른 글
mysqli - $result->close(); & $mysqli->close();를 꼭 해야 합니까? (0) | 2023.09.24 |
---|---|
워드프레스 사용자 정의 게시글 유형에서 필드 유효성 검사 및 표시 오류 (0) | 2023.09.24 |
Chart.js에 데이터 값을 표시하는 방법 (0) | 2023.09.24 |
HTML에서 페이지 새로 고침 시 페이지 스크롤 위치를 맨 위로 강제 적용 (0) | 2023.09.24 |
Laravel의 Expulent ORM에서 테이블 데이터를 피벗하여 주문하는 방법 (0) | 2023.09.24 |