본문으로 건너뛰기

· 약 2분

1. NextJs 설치

npx create-next-app

2. electron 폴더 및 index.js, preload.js 추가

index.js

// Native
const { join } = require("path");
const { format } = require("url");

// Packages
const { BrowserWindow, app, ipcMain } = require("electron");
const isDev = require("electron-is-dev");
const prepareNext = require("electron-next");

// Prepare the renderer once the app is ready
app.on("ready", async () => {
await prepareNext("./");

const mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: false,
preload: join(__dirname, "preload.js"),
},
});

const url = isDev
? "http://localhost:8000"
: format({
pathname: join(__dirname, "../out/index.html"),
protocol: "file:",
slashes: true,
});

mainWindow.loadURL(url);
});

// Quit the app once all windows are closed
app.on("window-all-closed", app.quit);

// listen the channel `message` and resend the received message to the renderer process
ipcMain.on("message", (event, message) => {
event.sender.send("message", message);
});

preload.js

const { ipcRenderer, contextBridge } = require("electron");

contextBridge.exposeInMainWorld("electron", {
message: {
send: (payload) => ipcRenderer.send("message", payload),
on: (handler) => ipcRenderer.on("message", handler),
off: (handler) => ipcRenderer.off("message", handler),
},
});

3. package.json 내용 수정

{
"name": "elec",
"version": "0.1.0",
"private": true,
"description": "Hello World!",
"main": "electron/index.js",
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint",
"clean": "rimraf dist out .next",
"electron:start": "electron .",
"electron:build": "next build && next export",
"electron:dist": "npm run electron:build && electron-builder"
},
"dependencies": {
"electron-is-dev": "^2.0.0",
"electron-next": "^3.1.5",
"eslint-config-prettier": "^8.5.0",
"next": "12.3.1",
"react": "18.2.0",
"react-dom": "18.2.0"
},
"devDependencies": {
"electron": "^21.1.0",
"electron-builder": "^23.6.0",
"eslint": "8.25.0",
"eslint-config-next": "^12.3.1"
},
"build": {
"asar": true,
"files": [
"electron",
"out"
]
}
}

4. eslintrc.json 수정

{
"root":true,
"extends": ["next/core-web-vitals", "prettier"]
}

참조링크

https://www.notion.so/Electron-Next-js-URL-282af8db7a3b4588b71122fc18d3eaf8#ff0602d1c7264aa699b87ffc20e00538 https://youtu.be/oAaS9ix8pes https://github.com/vercel/next.js/tree/canary/examples/with-electron https://kingsubin.tistory.com/475

· 약 3분

Next.js 기본 설치

설치목록

  • Next.js
  • Eslint
    • @typescript-eslint/eslint-plugin
    • eslint-config-prettier
  • Prettier
  • @next/bundle-analyzer
  • cross-env - Window, Mac 크로스 개발환경 Node
  • rimraf - Window, Mac 크로스 개발환경 폴더지우기
  • tsc-watch - typescript 개발을 위해

1. Next.js 설치

npx create-next-app@latest --typescript

2. Eslint, Prettier 패키지 설치

npm i -D @typescript-eslint/eslint-plugin prettier eslint-config-prettier

3. Vscode 세팅

// .vscode/settings.json
{
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
},
"editor.formatOnSave": true, // Tell VSCode to format files on save
"editor.defaultFormatter": "esbenp.prettier-vscode" // Tell VSCode to use Prettier as default file formatter
}

4. Eslint 설정

// .eslintrc.json
{
"extends": [
"next/core-web-vitals",
"plugin:@typescript-eslint/recommended",
"prettier"
],
"rules": {
"@typescript-eslint/no-unused-vars": "error",
"@typescript-eslint/no-explicit-any": "error"
}
}

5. Prettier 세팅

// .prettierrc.json
{
"semi": true,
"trailingComma": "es5",
"singleQuote": true,
"tabWidth": 2,
"useTabs": false,
"printWidth": 100
}

6. root(/)에 src폴더 생성 pages, styles 위치 이동

// before
└─/
├─pages
└─styles

// after
└─/
└─src
├─pages
└─styles

7. tsc-watch 설치

npm i -D tsc-watch

// .package.json
"scripts": {
"dev": "next dev",
"dev:ts": "tsc-watch --onSuccess \"npm run dev\"",
...
},

8. tsconfig.js 수정

// .tsconfig.js
"compilerOptions": {
"baseUrl": ".", /* 절대경로 모듈이 아닌, 모듈이 위치한 기준 디렉토리 */
"paths": { /* baseUrl 기준으로 불러올 모듈의 위치를 재지정하는 엔트리 */
"@/*": [
"src/*"
]
},
...
}

9. next bundle analzyer 설치

npm i -D @next/bundle-analyzer cross-env rimraf
// .next.config.js
const {
PHASE_DEVELOPMENT_SERVER,
PHASE_PRODUCTION_BUILD,
PHASE_PRODUCTION_SERVER,
// eslint-disable-next-line @typescript-eslint/no-var-requires
} = require('next/constants');

// eslint-disable-next-line @typescript-eslint/no-var-requires
const withBundleAnalyzer = require('@next/bundle-analyzer')({
enabled: process.env.ANALYZE === 'true',
});

module.exports = (phase, { defaultConfig }) => {
const isDevLocal = phase === PHASE_DEVELOPMENT_SERVER; // `npm run dev`
const isDevServer =
!process.env.PROD && (phase === PHASE_PRODUCTION_BUILD || phase === PHASE_PRODUCTION_SERVER); // `npm run build`
const isProdServer =
process.env.PROD && (phase === PHASE_PRODUCTION_BUILD || phase === PHASE_PRODUCTION_SERVER); // `npm run build:prod`

console.log(
`isDevLocal:${isDevLocal} isDevServer:${isDevServer} isProdServer:${isProdServer}`
);

const currentEnv = () => {
if (isDevLocal) return 'DevLocal';
if (isDevServer) return 'DevServer';
if (isProdServer) return 'ProdServer';
};

/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
swcMinify: true,
env: {
currentEnv: currentEnv(),
},
};

const plugins = [withBundleAnalyzer];
const config = plugins.reduce((acc, next) => next(acc), {
...nextConfig,
});
return config;
};
// .package.json
...
"scripts": {
...
"build-stats": "cross-env ANALYZE=true npm run build",
"clean": "rimraf .next out"
...
},

prettier css order

https://github.com/Siilwyn/prettier-plugin-css-order

10. 원스톱 설치

npm

npm i -D @typescript-eslint/eslint-plugin prettier eslint-config-prettier tsc-watch @next/bundle-analyzer cross-env rimraf

package.json

"scripts": {
"dev": "next dev",
"dev:ts": "tsc-watch --onSuccess \"npm run dev\"",
"build": "next build",
"build-stats": "cross-env ANALYZE=true npm run build",
"start": "next start",
"lint": "next lint",
"clean": "rimraf .next out"
},

Trouble shooting

1. next13 설치후 eslint, eslint-config-next 추가설치

// error message
> aipartner@0.1.0 lint
> next lint

Failed to load config "next/core-web-vitals" to extend from.
Referenced from: C:\work\aipartner\.eslintrc.json

참조링크

https://github.com/ixartz/Next-js-Boilerplate

Start a clean Next.js project with TypeScript, ESLint and Prettier

· 약 1분
Gao Wei

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet