Giter Site home page Giter Site logo

holiday_jp-js's People

Contributors

4geru avatar aki77 avatar camelmasa avatar dependabot[bot] avatar k1low avatar komagata avatar pine avatar teppeis avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

holiday_jp-js's Issues

Webpackがdevelopmentでビルドされている

現状、常にWebpackのdevelopmentモードでビルドされているようですが
パッケージとして公開する場合、package.jsonのmainに指定するのはproductionモードで
ビルドされたファイルが一般的かと思われます。

webpack.config.js

module.exports = {
//mode: 'development', //#開発用
  mode: 'production',//#公開用
  entry: './lib/holiday_jp.js',
  // 出力の設定
  output: {
    filename: 'holiday_jp_webpacked.js',
    // 出力先のパス(絶対パスを指定する必要がある)
    path: path.join(__dirname, 'scripts')
  }
};

between 関数を実行すると内部に保持されている祝日データセットの値が変化する

https://github.com/holiday-jp/holiday_jp-js/blob/master/lib/holiday_jp.js#L22

この実行によって、祝日データセットの値が date が文字列型から Date 型の値へ変化する。
between 関数は Date 型に変更してオブジェクトを返す意図があると思われるが、値の変更自体は意図しているでしょうか? 🤔

var holiday_jp = require(".")
holiday_jp.holidays['2010-09-20'].date //  '2010-09-20'
var holidays = holiday_jp.between(new Date('2010-09-14'), new Date('2010-09-21'));
holiday_jp.holidays['2010-09-20'].date // 2010-09-20T00:00:00.000Z

何らかの方法で shallow copy ではなく deep copy の処理をすることで、変数が変更される事は避けられそうです。

LISENCEファイルについて

このライブラリを「再配布を伴う利用」するにあたり、ライセンス文を探しています。
もし可能であれば、このリポジトリにライセンスファイルをあげていただきたいです。

参考情報:
このリポジトリ内から参照していると思われる holiday_jpのプロジェクトにはライセンスファイルを見つけました。

実行環境のタイムゾーンによって出力結果が変化する

状況の再現方法

node_moduleとしてインストール

  • @holiday-jp/holiday_jp: 2.4.0
  • node: v14.19.3
// main.js
var holiday_jp = require("@holiday-jp/holiday_jp");

// "Asia/Tokyo"(+0900) 以外のタイムゾーンで実行すると結果が変化する場合がある
// process.env.TZ = "Asia/Tokyo";

// 元旦
var date = new Date("2022-01-01T00:00:00+0900");
console.log(date.toString());
console.log(holiday_jp.isHoliday(date)); // expected true;
console.log(holiday_jp.between(date, date)); // expected not-empty list
node main.js

codesandbox

実行結果

sandboxの設定やprocess.env.TZの値を変化させ異なるタイムゾーンで実行します

Asia/Tokyo +0900

予期した通りの結果が得られました

Sat Jan 01 2022 00:00:00 GMT+0900 (Japan Standard Time)
true
[
  {
    date: 2022-01-01T00:00:00.000Z,
    week: '',
    week_en: 'Saturday',
    name: '元日',
    name_en: "New Year's Day"
  }
]

UTC +0000

結果が変わります

Fri Dec 31 2021 15:00:00 GMT+0000 (Coordinated Universal Time)
false
[]

質問

こちらは意図した動作でしょうか?

"YYYY-MM-DD"の文字列表現に変換する関数format内部で、タイムゾーンに影響される関数 Date#get**をそのまま利用しているのが原因そうです。

var year = date.getFullYear();
var month = ('0' + (date.getMonth() + 1)).slice(-2);
var day = ('0' + (date.getDate())).slice(-2);

指定した年月の祝日オブジェクトの読み込み可能とする js を作成し、バンドルした際のファイルサイズを減らす選択が可能となる提案

課題

プロジェクトの要件によっては、現在の年月から数年の祝日オブジェクトがあれば要件が満たせる場合があります。
現在、@holiday-jp/holiday_jp npm を利用して webpack などでバンドルした場合 170KB ほどのファイルサイズとなりますが、2022年から2024年までの3年間のみに祝日データを絞った場合 8KB ほどにファイルサイズを低減することが可能となります。

改善案

現在 require('@holiday-jp/holiday_jp') した際に、自動で1970年から2050年までの祝日オブジェクトを生成しているが、指定した年数の祝日オブジェクトを追加可能とする js を作成するのはどうでしょうか?
既存の js を変更すると破壊的な変更となるので、一旦は以下のように require('@holiday-jp/holiday_jp/lib/plain') などの新たな js の作成を提案します。

以下は利用イメージです。

var holiday_jp = require('@holiday-jp/holiday_jp/lib/plain'); // 読み込み時に全ての祝日オブジェクトの読み込みを行わない
var holidays_2022 = require('@holiday-jp/holiday_jp/lib/holidays/2022');
var holidays_2023 = require('@holiday-jp/holiday_jp/lib/holidays/2023');
var holidays_2024 = require('@holiday-jp/holiday_jp/lib/holidays/2024');
holiday_jp.set_holidays([holidays_2022, holidays_2023, holidays_2024])

var holidays = holiday_jp.between(new Date('2022-09-14'), new Date('2022-09-21'));
console.log(holidays[0]['name']); // 敬老の日

その他

雑に上記の実装をしてみたブランチ (camelmasa@87fa14a) を、利用しているプロジェクトでバンドルしたところ以下のような結果となりました。

169.68KB から 7.5KB

スクリーンショット 2022-06-11 23 49 10

スクリーンショット 2022-06-11 23 47 58

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.