私はwebpackビルドでmomentを使用しています。
require('moment')
は、CDNのmoment-with-locales.min.js
を使用するのと同じように見えます(主にバンドルのサイズの増加から判断します)。
デフォルトの英語ロケールのみで瞬間を要求する方法はありますか? (つまり、CDNからのmoment.min.js
相当します)。
私の質問は#2373に関連していると思います
webpackであなたと同じ問題が発生しました。 このSOの投稿では、ロケールのパッケージ化を回避する2つの異なる方法について説明しています。http :
IgnorePlugin
は私のために仕事をしました:
plugins: [
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)
]
とてもかっこいい、ありがとう@balexand
IgnorePluginがその仕事をします、瞬間を追加するとき、私は11kbまでgzip圧縮されています。
それでも、ロケールありまたはロケールなしで要求するオプションがあると便利です。 すでに#2373があるので、これを閉じます
このコメントによると、npmjsにロケールがない瞬間があるはずです。
このモジュールは、ロケールなしで瞬間を公開しますhttps://github.com/ksloan/moment-mini
moment
をangular-cli
moment
と一緒に使用すると、ロケール全体がバンドルに含まれるようになります。
私は--eject
フラグを使用していないので、これはhttps://github.com/moment/moment/issues/2416#issuecomment-111713308で機能していません。 ロケールを除外するためのangular-cli
解決策はありますか?
@balexandありがとう、それは私のために働く
誰かがタイピングを見逃した場合、ここに私のフォークがあります:
https://github.com/kirillgroshkov/moment-mini-ts
npm i moment-mini-ts
import * as moment from 'moment-mini-ts'
私が選んだものを除いて、IgnorePluginですべてのロケールを無視するのはどうですか? たとえば、EN、ES、FRを除くすべてを無視します。 それは正規表現で行うことができますか?
plugins: [
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)
]
編集:誰かがまだそれを必要とする場合に備えて、私はそれを理解しました。 https://stackoverflow.com/a/25426019/2477303にあります
plugins: [
new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /en|es|fr/),
// new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)
]
@kuncevic 、 locale
でangular-cli
locale
を除外することを達成しましたか?
ちょっとハッキーだとは思いますが、私たちのプロジェクトでは、次の内容のmoment-angular-cli-patch.js
ファイルを作成しました。
'use strict';
const fs = require( 'fs' );
console.log( 'Patchin internal Angular CLI configuration ...' );
const webpackProductionConfigPath = './node_modules/@angular/cli/models/webpack-configs/production.js';
fs.readfile( webpackProductionConfigPath, 'utf-8', ( error, fileContent ) => {
const momentFix = 'extraPlugins.push( new webpack.ContextReplacementPlugin( /moment[\\/\\\\]locale$/, /de.js/ ) );';
if ( fileContent.indexOf( momentFix ) === -1 ) {
const uniqueContent = 'return {'; // Line 112
const modifiedFileContent = fileContent.replace( uniqueContent, `${ momentFix }\n ${ uniqueContent }` );
fs.writeFile( webpackProductionConfigPath, modifiedFileContent, 'utf-8', ( error ) => {
console.log( 'Done.' );
} );
} else {
console.log( 'Nothing to do.' );
}
} );
上記のスクリプトは、ドイツ語を除くすべてのロケールを無視し、 @angular/cli 1.5.0
用に特別に記述されています(他のバージョンは別の方法で処理する必要がある場合があります)。 package.json
ファイル内で、スクリプトに追加しました。
"scripts": {
"postinstall": "node ./moment-angular-cli-patch.js"
}
優れたソリューションではありませんが、機能するソリューション...
@ dominique-興味深いアイデアであるmueller、共有してくれてありがとう
@ dominique-mueller今のところ面白いアイデアです、ありがとう
@ dominique-muellerアイデアをありがとう! しかし、角度のあるcliではなく瞬間にパッチを適用することになりました。
const fs = require('fs');
const filePath = './node_modules/moment/moment.js';
const patch = {
find: 'var aliasedRequire = require;',
replace: 'var aliasedRequire = function(){};'
};
console.log('Patching moment');
let source = fs.readFileSync(filePath);
const index = source.indexOf(patch.find);
if (index === -1) {
console.log('Nothing to do.');
} else {
source = source.toString().replace(patch.find, patch.replace);
fs.writeFileSync(filePath, source, 'utf-8');
console.log('done');
}
@ dominique-mueller興味深いアイデアですが、パッチが実際にangular-cliのバージョンに依存していることを考えると、angular-cliの内部Webpack構成にパッチを適用することは長期的には良いアイデアではないと思います。本当に簡単に更新できません。 同じことがmomentconfigのパッチにも当てはまります。
理想的な解決策は、AngularがWebpack構成を開くことです。これにより、プラグインや瞬間を追加して、バンドルに未使用のものをそれほど多く含まないようにするオプションを提供できます。
@fergardiのコメントに加えて、正規表現をわずかに変更することで、不要なロケールが含まれることを回避できます。
plugins: [
new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /(en|es|fr)$/),
]
この方法では、 es-*
es-do
、 es-us
などのすべてのes-*
ロケールを取得することはできません。
実際、この変更を行わないと、すべての地域の違いにより、3つではなく13のロケールになります。
ngx-build-plusを使用すると、AngularCLIでWebpack構成をイジェクトせずに調整できるはずです。
@SamVerschuerenこれはすごいです😸
モジュールからいくつかのディレクトリを無視するにはどうすればよいですか? 私のプロジェクトは巨大で、prodビルド中に提供しているので、チャンクごとにチャンクをビルドすることを考えているので、いくつかのディレクトリを無視/除外する必要がありますか? その少し緊急を助けてください。 前もって感謝します。
ベストプラクティスを使用するこれに対する更新はありますか? 最近の問題でこの修正が再度参照されていることがわかりますhttps://github.com/urish/ngx-moment/issues/212
最も参考になるコメント
webpackであなたと同じ問題が発生しました。 このSOの投稿では、ロケールのパッケージ化を回避する2つの異なる方法について説明しています。http :
IgnorePlugin
は私のために仕事をしました: