npm 레지스트리에서 특정 패키지에 대한 메타데이터 및 기타 정보를 볼 수 있습니다. 이 명령으로 패키지의 최신 버전, 패키지의 종속성, 작성자 및 라이선스 정보, 기타 세부 정보를 확인할 수 있습니다.
# 이전 버전 리스트를 확인하고 싶을때
npm view cowsay versions
# 각 버전이 게시된 시간을 확인
npm view cowsay time
Footnotes
-
설치된 npm 패키지의 버전을 확인하는 방법에 대한 가이드 ↩
// 현재 실행된 stage 값을 참조하기
// 하지만 스크립트를 따로 작성하는게 더 효율적으로 보인다.
{
"scripts": {
"dev:hello": "echo ${npm_lifecycle_event//dev:/}"
}
}
- yarnpkg - Is there a way to get the name of the npm script passed to the command specified by that script? - Stack Overflow1
- scripts | npm Docs2
Footnotes
# .env
REACT_APP_VERSION=0.0.0-${TURBO_HASH}
REACT_APP_VERSION을 자동으로 입력할 방법을 찾다가 결국 hash값을 추가했다.
# `System limit for number of file watchers reached`
echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
# 빌드 시 timestamp를 참조하기 위한 방법
timestamp=$(date +%s) # 1670759329
# 하지만 현실에서는 `TURBO_HASH`값을 참조하는 방식을 `.env`에서 사용
REACT_APP_VERSION=1.0.0-${TURBO_HASH}
Footnotes
로컬에서만 실행 해야하는 프로젝트가 있길래 아무래도 사전설정 같은 귀찮은 문제가 있으니 pkg를 사용하면 좋을 것 같아서 들어가봤는데 개발이 중단 되었다.
노드 21버젼에서 해당 기능이 지원되는데 재미있는 시도들이 많이 나왔으면 좋겠다.
Astro를 사용한 프로젝트에서 빌드를 하는데 JavaScript heap out of memory 에러가 발생했다.
쉽게 해결하자면 NODE_OPTIONS=--max_old_space_size
(in megabytes) 설정해서 우회할수는 있겠지만 정리가 필요해서 메모를 남겨본다.
일단 원인은 파일사이즈가 크다는 점, 그리고 카테고리(국가)별 데이터가 많다는 점인데 개선할만한 부분은 두가지 정도인 듯.
- 가능한 전처리해서 데이터를 다시 생성해서 참조
Astro.glob
을 사용해서 조건부로 데이터를 가져오기
예상치 못한 에러였는데 역시 트레이드오프는 존재하기 마련이다.
Excel View1 라이브러리를 보던 중, Excel과 Node의 상호작용에 대한 궁금증이 생겼다. 아무래도 웹개발을 하다보니 어플리케이션과 통신할 수 있는 부분에 대해서 전혀 생각을 안했었다는 걸 깨닫고 이러한 부분을 보완하기 위해 Excel과의 통신 방식을 찾아봄.
우선, 위 라이브러리 코드를 통해 ActiveXObject('Excel.Application')
2로 Excel 객체를 생성하고, 이를 통해 Excel의 다양한 기능에 접근할 수 있다는 것을 확인했다. 그리고 node-activex의 문서에서 링크를 통해 추가적인 정보들을 확인할 수 있었는데 아무래도 자주 보던 영역이 아니라 일단 확인만 하는 단계에서 멈춤.
이 접근을 통해, Excel과 상호작용하는 방법에 대해 실마리를 찾을 수 있었음. 그러나 모든 과정이 순조롭지만은 않은게. ActiveXObject
를 사용하는 부분에서 개념적 이해가 부족했고, 그밖에 Excel의 객체모델에 대해서도 배경지식이 많이 부족하다는 걸 알게됨.
이번 경험을 통해, 웹 개발자가 어플리케이션 레벨의 개념들도 이해하면 좋겠다는 생각을 하게 됨. 나중에 기회가 되면 살펴보고 일단 view 기능을 스프레드시트로 구현해 봐야겠다.
Footnotes
-
Excel에서 긴 줄을 탐색하는 데 도움이 되는 도구입니다. 활성 셀을 추적하고 전체 행 데이터를 자동으로 가져와 별도의 창에 표시합니다. 이를 통해 좌우로 스크롤하지 않고도 행의 모든 열을 쉽게 볼 수 있습니다. ↩
-
https://github.com/timepp/excelview/blob/master/excel.js#L70 ↩
imagemin을 사용하려고 하는데 module로 라이브러리가 업데이트 되어서 찾아본 내용. 혼란스러운 부분도 있지만 성숙해지는 과정이라고 본다.
- Pure ESM package · GitHub
- Get Ready For ESM. JavaScript Modules will soon be a… | by Sindre Sorhus | 🦄 Sindre Sorhus’ blog
- Hello, Modules!. JavaScript Modules, also known as ESM… | by Sindre Sorhus | 🦄 Sindre Sorhus’ blog
- Publish ESM and CJS in a single package1
Footnotes
이미지 다운로드 구현. 이미지 응답값을 buffer로 변환해서 파일쓰기로 저장한다.
const fs = require('fs')
const util = require('util')
const fetch = require('node-fetch')
const writeFile = util.promisify(fs.writeFile)
const mkdir = util.promisify(fs.mkdir)
const FOLDER_PATH = 'FOLDER_PATH'
async function download({ url }) {
const response = await fetch(url)
const buffer = Buffer.from(await response.arrayBuffer())
if (!fs.existsSync(FOLDER_PATH)) {
await mkdir(FOLDER_PATH)
}
await writeFile(url, buffer)
}
import sharp from 'sharp'
import fg from 'fast-glob'
const entries = await fg('./**/*.png')
for (const entry of entries) {
const trimmedBuffer = await sharp(entry).trim().toBuffer()
const trimmedImage = sharp(trimmedBuffer)
const trimmedMetadata = await trimmedImage.metadata()
trimmedImage
.resize({
width: Math.round(trimmedMetadata.width / 2),
height: Math.round(trimmedMetadata.height / 2),
})
.png()
.toFile('output.png')
}
offset(top, left)값, 이미지 사이즈 설정으로 crop 구현이 가능하다
sharp('img.png')
.extract({
left: 50,
top: 50,
width: 200,
height: 400
})
- yarn upgrade-interactive | Yarn1
- Find newer versions of package dependencies than what your package.json allows2
Footnotes
-
이 명령은 업그레이드를 수행하기 전에 오래된 패키지를 표시하여 사용자가 업그레이드할 패키지를 선택할 수 있도록 합니다. ↩
-
npm-check-updates는 지정된 버전을 무시하고 package.json 종속성을 최신 버전으로 업그레이드합니다 . ↩
CSV와는 다르다! CSV와는!
const fs = require('fs')
const XLSX = require('xlsx')
const buf = fs.readFileSync('developer_labels_20181221.xlsx')
const workbook = XLSX.read(buf, { type: 'buffer' })
const roa = XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]], {
header: 1,
})
const result = roa
.slice(1)
.map((item) => item.slice(1, 4))
.filter((item) => item.some(Boolean))
.reduce(
(p, n) => {
const [key, en, ko] = n
const newKey = key.toLowerCase().replace(/\-/g, '_')
p['en'][newKey] = en
p['ko'][newKey] = ko
return p
},
{ en: {}, ko: {} }
)
fs.writeFileSync('en.json', JSON.stringify(result.en), 'utf8')
fs.writeFileSync('ko.json', JSON.stringify(result.ko), 'utf8')
// package.json 파일에 로컬 경로를 지정하는 방법. 파일 시스템에 있는 패키지 디렉터리를 사용할 수 있음.
{
"dependencies": {
"bar": "file:../foo/bar"
}
}
# 특정 패키지에 모듈을 설치해야한다면
yarn workspace <workspace_name> <command>