webpack으로 moment.js가 로캘을로드하지 못하게하는 방법은 무엇입니까?


199

moment.js웹팩을 사용할 때 모든 로케일을로드 하지 못하게 할 수있는 방법이 있습니까? 나는 소스를보고 hasModule있는데 webpack에 대한 것이 정의 되어 있으면 항상 require()모든 로케일을 시도 하는 것 같습니다 . 이 문제를 해결하려면 풀 요청이 필요하다고 확신합니다. 그러나 webpack 구성으로이를 해결할 수있는 방법이 있습니까?

momentjs를로드하는 웹 팩 구성은 다음과 같습니다.

resolve: {
            alias: {
                moment: path.join(__dirname, "src/lib/bower/moment/moment.js")
            },
        },

그런 다음 필요한 곳이면 어디든 할 수 require('moment')있습니다. 이것은 작동하지만 약 250kB의 불필요한 언어 파일을 내 번들에 추가하고 있습니다. 또한 나는 bowers 버전의 momentjs와 gulp를 사용하고 있습니다.

또한 webpack 설정으로 해결할 수없는 경우 여기 로케일을로드하는 함수에 대한 링크가 있습니다 . 나는 진술에 추가 && module.exports.loadLocales를 시도했지만 ifwebpack은 실제로 그것이 작동하는 방식으로 작동하지 않는다고 생각합니다. 그것은 require무엇이든 상관 없습니다. 나는 그것이 정규식을 사용한다고 생각하므로 실제로 어떻게 고칠 지 모른다.


nmp대신에 순간을 사용하려고 했습니까 bower?
Andreas Köberle

모든 클라이언트 라이브러리에 bower를 사용하고 모든 빌드 도구에 npm을 사용하고 있습니다. 내 프로젝트가 어떻게 구성되어 있는지 이렇게 유지하고 싶습니다. 또한 github.com/moment/moment/issues/1866 의 마지막 회신을 보면 내 문제를 해결했지만 약간의 소스 편집이 필요합니다. 노드와 웹팩을 어떻게 구분할 수 있는지 알지 못하므로 여전히 올바른 방법으로 수정하는 방법을 모릅니다.
epelc

답변:


305

코드 require('./locale/' + name)locale디렉토리의 모든 파일을 사용할 수 있습니다 . 따라서 webpack에는 모든 파일이 번들의 모듈로 포함됩니다. 사용중인 언어를 알 수 없습니다.

있습니다 이 플러그인 : 더 모듈이 번들에 포함되어야에 대한 정보 웹팩 제공하는 유용 ContextReplacementPlugin하고 IgnorePlugin.

require('./locale/' + name)컨텍스트 (표현식을 포함해야 함)라고합니다 . webpack은이 코드 조각에서 일부 정보를 유추합니다 : 디렉토리 및 정규식. 여기 : directory = ".../moment/locale" regular expression = /^.*$/. 따라서 기본적으로 locale디렉토리의 모든 파일 이 포함됩니다.

ContextReplacementPlugin이를 통해 추론 된 정보를 재정 의 할 수 있습니다. 즉, 포함 할 언어를 선택하기 위해 새로운 정규식을 제공합니다.

또 다른 방법은로 요구 사항을 무시하는 것 IgnorePlugin입니다.

예를 들면 다음과 같습니다.

var webpack = require("webpack");
module.exports = {
  // ...
  plugins: [
    new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /de|fr|hu/)
    // new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)
  ]
};

3
무시 로더를 사용하는 방법을 설명 할 수 있습니까? `new webpackreg.IgnorePlugin (/\.\/ locale \ /.+. js $ /, [])`을 시도했지만 작동하지 않았습니다. 또한 contextReplacementPlugin은 여전히 ​​파일을 사용하지 않았다고 생각하는 번들에 파일을 포함했습니다.
epelc

9
moment + webpack에 대한 자세한 논의가 포함 된 이 문제 ( github.com/webpack/webpack/issues/198 )를 살펴볼 수 있습니다 .
Tobias K.

2
new webpack.IgnorePlugin(/^\.\/lang$/, /moment$/)github에 대한 귀하의 의견에서 효과가 있다고 생각 합니다.
epelc

16
웹팩 문서에서 두 번째 인수는 정규 표현식의 배열입니다. 나는 plugins: [ new webpack.IgnorePlugin(/^\.\/locale$/, [/moment$/]) ],잘 작동하는 것을 시도했다 .
Alex K

6
@AlexKinnee 문서에서 대괄호 표기법 은 배열이 아니라 선택적 인수임을 의미합니다.
yangmillstheory 2016 년

8

우리 프로젝트에는 다음과 같은 순간이 포함되어 import moment from 'moment/src/moment';있습니다. 우리의 순간 사용법은 매우 간단하므로 SDK와 불일치가 있는지 확실하지 않습니다. WebPack은 로케일 파일을 정적으로 찾는 방법을 모르기 때문에 (빈 폴더를 추가하여 쉽게 숨길 수 있음) 경고가 표시 moment/src/lib/locale/locale되지만 로케일을 포함 하지 않기 때문에 이것이 효과가 있다고 생각합니다 .


1
이 사람이 어떻게 당신을 위해 일하고 있는지 잘 모르겠습니다 ... 방금 github.com/angular/angular-cli/issues/6137 과 싸우려고 시도한 다음 github.com/ksloan/moment-mini 사용하여 끝났습니다 . 적절한 모듈 형 moment라이브러리는 어떤 시점에서 버전 3 github.com/moment/moment/milestone/15 와 함께 제공됩니다 .
kuncevic.dev


2

Adam McCrmick의 답변을 바탕으로 가까운 곳에 별칭을 다음과 같이 변경하십시오.

resolve: {
    alias: {
        moment: 'moment/src/moment'
    },
},

1
경고로, 포함 된 모든 모듈의 동작이 변경되고 타사 라이브러리에 흥미로운 문제가 발생할 수 있습니다. 그것은 일반적으로 생각에서 작동합니다
아담 맥코믹에게

1
당신은 정교한 수 있습니까? 모든 별칭 사용 사례에 경험이 없습니다. 내 이해에 따르면, 당신이 그 모듈을 만진 경우에만 중요합니다.이 경우 '모멘트'
bigopon

3
별명 확인을 설정하면 별명은 가져 오기 사용 또는 시스템 (필요한 라이브러리 포함)에 필요합니다. 따라서 필요한 순간에 의존하는 모듈 인 경우 해당 모듈의 결과도 변경됩니다. 종속성 트리에서 노드 모듈과 충돌하는 별명을 설정하면 (예 : 종속성이 해당 라이브러리를 사용하는 경우와 같은 "이벤트"와 같이) 발생합니다. 실제로, 나는 이와 같은 동작 개선이 아닌 이름 충돌과 관련된 문제 만 있었지만 이것은 하나의 import 문을 변경하는 것보다 더 위험한 접근법입니다.
Adam McCormick

2

으로 webpack2당신이 할 수있는 순간의 최신 버전과 :

import {fn as moment} from 'moment'

그리고 webpack.config.js당신은 :

resolve: {
    packageMains: ['jsnext:main', 'main']
}

1
나는 당신이 의미 추측mainFields: ...
기예르모 라우

webpack2를보고 필드 이름이 변경되었는지 확인하십시오.
케빈
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.