โครงการ Deno รันไทม์จาวาสคริปต์ ออกเวอร์ชัน 1.28 มีของใหม่ที่สำคัญคือรองรับโมดูล npm ของโครงการ Node.js ตามที่ประกาศไว้ ทำให้เราสามารถอิมพอร์ตโมดูล npm ที่มีมหาศาล 1.3 ล้านโมดูลมาใช้กับ Deno ได้
การใช้งาน npm ของ Deno ไม่จำเป็นต้องสั่ง npm install เพราะโมดูลจะถูกติดตั้งตอนรันโปรแกรมครั้งแรก, ไม่ต้องมีไฟล์ package.json และไม่ต้องมีโฟลเดอร์ node_modules เพราะโมดูลจะถูกแคชในไดเรคทอรี global แทน
ทีมงาน Deno บอกว่าอาจยังมีโมดูล npm บางส่วนที่ยังทำงานเข้ากันไม่ได้ ซึ่งจะทยอยแก้ไขไปเรื่อยๆ แต่โมดูลดังๆ ที่ใช้งานได้แล้วก็อย่างเช่น Prisma, Mongoose, Apollo, React, Vue, Express เป็นต้น
ที่มา - Deno
Comments
ลองดูแล้วตัว npm package ยังแตกไฟล์ออกมาอยู่ แต่ด้วยความเป็น global เลยเขียนอะไรลงไปในนั้นไม่ได้ (ก็สมควรแล้ว) อนาคตจะเก็บเป็นแบบไม่แตกไฟล์แบบ Yarn PnP มั้ยนะ
ไม่ต้องมี package.json แต่ต้องเอา version ไปใส่ใน source code แทน ดูแล้วไม่ ok
ถ้ามีหลายๆ project ที่ใช้ library เดียวกันในเครื่อง นี้มีปัญหาแน่นอน (package manager ส่วนใหญ่เลยใช้วิธีสร้าง local environment by default)
ไม่มี package.json แต่มี import_map.json แทนได้ครับ
จริงๆ มันก็ไม่ควรมีปัญหามั้ยนะครับถ้ามันเป็นแค่ให้ไปอ่านเฉยๆ 😅
แต่ใช่แหละ ถ้ามันไม่มีปัญหา Yarn PnP นี่น่าจะสบายไม่เจอปัญหาอยู่จนทุกวันนี้ไปแล้ว orz
สมมุติไม่มี package.json และมี module webpack5 อยู่ใน global
projectA depend on webpack4 import ปกติไม่เจาะจง version
projectB depend on webpack5 import ปกติไม่เจาะจง version
จาก code Deno จะ resolve แต่ webpack5 module มาให้
ฉะนั้น projectA error แน่นนอน
แต่ projectB ยัง run ได้ปกติ
อันนั้นเป็นเพราะไม่เจาะจง version นี่ครับ? ซึ่ง projectA แค่ย้ายไปรันบนเครื่องอื่นก็พังแล้วเพราะจะได้ webpack5 แทน?
ไม่ต้องย้ายก็พังได้ครับ ถ้า projectA สร้างตอนยังไม่มี webpack5
ใช่ครับ ผมเลยว่าปัญหามันไม่น่าอยู่ที่ไม่มี package.json นี่นา
สำหรับผม manifest ของ package manager หน้าที่หลักมันคือใช้บอก dependencies + version เพื่อให้ package manager ไป download, resolve path ได้ถูกต้องครับ
ไม่ว่าจะเป็น package.json, composer.json, vcpkg.json, requirements.txt ก็มีหน้าที่นี้เหมือนกัน
ขอบคุณครับ
อันนี้ผมมองว่าไม่ใช่ปัญหาของการไม่มี package.json หรือการเอา npm cache ไปใช้เป็น global แต่เป็นการที่ยอมให้ใช้ import (หรือ import_map.json) ได้โดยที่ version specific เป็น optional มากกว่า
คือใช้ดีๆ แบบระบุ version ได้เลย แต่ด้วยความที่มัน optional เลยใช้แบบ bad practice ได้ (แย่กว่าการลบ lock file ของ npm, yarn ที่โอกาสพังน้อยกว่า)
สุดท้ายผมว่าประเด็นอาจจะไปตกที่มันไม่มี lock file ด้วยครับ คือถึงทำ import_map.json แบบระบุ version แล้วแต่ไม่มี lock file นี่ก็น่าจะพังอยู่ดี T-T