์๋ ํ์ธ์,
webpack.entry๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ๋ฉด ๋ด ์ฑ์ด ์ถฉ๋ํ๊ณ 404๋ฅผ ๋ฐํํ๋ ํ์ฌ ๊ฒฝ๋ก / cba38462455a43d162b5.worker.js
๋ก ์ด๋ํ๋ ๋คํธ์ํฌ ์์ฒญ์ ๋ณผ ์ ์์ต๋๋ค.
import { Document, Page } from 'react-pdf/build/entry.webpack'
๊ฐ์ ธ ์ค๋ ์ค์
๋๋ค.
๋ด webpack ๊ตฌ์ฑ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
const path = require('path');
const webpack = require('webpack');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const settings = {
entry: {
bundle: [
'babel-polyfill',
"./src/frontend/index.js"
]
},
output: {
filename: "[name].js",
path: path.resolve("build")
},
resolve: {
extensions: [".js", ".jsx", ".json", ".css"]
},
devtool: "eval-source-map",
module: {
rules: [
{
test: /\.(js|jsx)?$/,
exclude: /node_modules/,
loader: 'babel-loader',
options: {
presets: [
["es2015", { modules: false }],
"stage-0",
"react"
],
plugins: [
"transform-decorators-legacy",
"transform-node-env-inline"
],
env: {
development: {
presets: ['react-hmre'],
plugins: ["react-hot-loader/babel"]
}
}
}
},
{
test: /\.css$/,
use: [ 'style-loader', 'css-loader','less-loader'],
include: [/flexboxgrid/,/react-star-rating/]
}
]
},
devServer: {
contentBase: path.resolve("src/www"),
publicPath: "http://localhost:8080/", // full URL is necessary for Hot Module Replacement if additional path will be added.
quiet: false,
hot: true,
historyApiFallback: true,
inline: true
},
plugins: [
new webpack.NamedModulesPlugin(),
new webpack.LoaderOptionsPlugin({
debug: true
}),
],
};
module.exports = settings;
์๋
ํ์ธ์ @benoj , ๋ฆ๊ฒ ํ์ ํด .worker.js
๊ฐ์๋ ํ์ผ์ด ์์ต๋๊น? ๋ชจ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋๋ฉด ํ๋๊ฐ ์์ด์ผํฉ๋๋ค.
@wojtekmaj ๊ฑฑ์ ๋ง์ธ์-๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง๋ง ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๊น?
์์
์๊ฐ /<hash>.worker.js
์์๋ก๋๋๋ฏ๋ก /
์๋ก๋ํ๋ฉด ์ฑ์ด ์ ๋๋ก ์๋ํ์ง๋ง /subresource
์๋ก๋ํ๋ฉด /subresource/<hash>.worker.js
๋ํด 404๊ฐ ํ์๋ฉ๋๋ค. ๋ด devserver๊ฐ ์์
์๊ฐ ์์ฑ ๋ ๋น๋ ํด๋์ ๋ชจ๋ ํ์ผ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ฌ๋ ์์
์๊ฐ ์ ๋ ๊ฒฝ๋ก๊ฐ ์๋ ์๋ ๊ฒฝ๋ก๋ก ๋๋ฆฌ๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค.
์ด์จ๋ ์ด๊ฒ์ ๋ฌด์ ํ์๊ฒ ์ต๋๊น?
@benoj ์์ ์๋ฃจ์ ์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง devServer์๋ง ์ํฅ์ ๋ฏธ์น๋ ๊ฒฝ์ฐ devServer ํ๋ก์ ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ชป๋ ๋ฐฉํฅ์ผ๋ก ์งํ๋๋ ์์ฒญ์ ๋ฆฌ๋๋ ์ ํ ์ ์์ต๋๋ค.
@wojtekmaj ์๋์ ํ๋ก๋์ ์ฑ์๋ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
์ฑ์ ๋ฐ์ ๋ผ์ฐํฐ๋ฅผ ์ฌ์ฉํ๋ ๋จ์ผ ํ์ด์ง ์ฑ์ ๋๋ค. ๋ฃจํธ๊ฐ ์๋ ์์ค์์ ์ฑ์ ์ด๋ฉด ์์ ์์ ๋ํ ์์ฒญ์ด ์๋ชป๋ ๊ฒฝ๋ก๋ก ์ด๋ํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก /{hash}.worker.js
๋ํ ์ ๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ์ฌ ์์ ํ ์ ์์ต๋๋ค. ํ์ฌ ์๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ ์ ํ ์ ์์ต๋๊น?
๋ํ ํด์๊ฐ ์ด๋ป๊ฒ ๊ณ์ฐ๋๋์ง ์๊ณ ์์ต๋๊น? ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ด ์ผ์ ํ๋ค๋ฉด?
๋ฒค
ํ ... Webpack์์ ๋์ ์ผ๋ก ๊ฐ์ ธ์จ ๋ชจ๋ ํ์ผ์ด ๋์ผํ ๋
ผ๋ฆฌ๋ฅผ ๊ณต์ ํ๋ค๊ณ ์๊ฐํ๋ฏ๋ก /
์ด์ธ์ ๋ค๋ฅธ ๊ณณ์์๋ ๋์ ๋์ ์ผ๋ก ๋ค์ด๋ก๋ ๋ ๋ชจ๋ ๋ฒ๋ค์ ๋ฌธ์ ๊ฐ์์ ์ ์์ต๋๋ค. Webpack ๊ตฌ์ฑ์์ output.publicPath
์ด ๋๋ฝ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ด ์นํฉ (์)์ ๋ค์์ผ๋ก ์ ๋ฐ์ดํธํ์ต๋๋ค.
output: {
filename: "js/[name].js",
path: path.resolve("build"),
publicPath: '/js'
}
ํ์ง๋ง [hash].worker.js
์ด /js
ํด๋์ ๋น๋๋์ง ์๊ณ ์ฑ์ ์์ฒญ์ด ์ด์ /subresource/js/[hash].worker.js
ํ๋ฏ๋ก ์ฌ์ ํ 404๋ก ํด๊ฒฐ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ํด ํผ๋ ์ค๋ฝ์ต๋๊น? ๋ด ์นํฉ์ ์๋นํ ํ์ค์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ด๊ฒ์ ๋ณด์ง ๋ชปํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๊น?
์ ๋ฐ์ดํธ : ์๋ํ์ต๋๋ค. ์ด ์๋ฃจ์ ์ ๋ํ ๊ทํ์ ์๊ฒฌ์ ๋ฃ๊ณ ์ถ์ต๋๋ค.
๋ด ์์ ์ pdf.worker๋ฅผ ๋น๋ํ๊ธฐ ์ํด webpack์ด ์ ๋ฐ์ดํธ๋์์ต๋๋ค.
entry: {
bundle: [
'babel-polyfill',
"./src/frontend/index.js"
],
'pdf.worker': 'pdfjs-dist/build/pdf.worker.entry'
},
output: {
filename: "js/[name].js",
path: path.resolve("build"),
publicPath: 'js/'
}
workerSrc๋ฅผ js ์ถ๋ ฅ ๊ฒฝ๋ก์ ์๋์ผ๋ก ์ค์
import Document from 'react-pdf/build/Document';
import Outline from 'react-pdf/build/Outline';
import Page from 'react-pdf/build/Page';
import React from 'react';
const pdfjs = require('pdfjs-dist');
pdfjs.PDFJS.workerSrc = '/js/pdf.worker.js';
ํ , ์ ํ ๋์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์๋๋๋ค!
๋๋ ์ด๊ฒ์ด webpack-loader
์ ์ ์ฅ์์์ ๋ ๋ง์ด ๋
ผ์๋์ด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๊ฒฐ์ฝ Webpack ์ ๋ฌธ๊ฐ๊ฐ ์๋๋ฏ๋ก ์์
์๊ฐ ์ผ๋ฐ ๋ฒ๋ค๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ๋์ง ์์ผ๋ฉด ๋ ๋์ ์๋ฃจ์
์ ์ฐพ๊ณ ์๋ ๋ฐฉ์์ ๋ํ ์์ ์ฌํญ์ ์ฐพ์ ์ ์์ต๋๋ค.
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ์กฐ๊ธ ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ผ๋ก ์์ ์ PDFJS ์ค์ ์ ์ค์ ํ๋ ์ง์์ด ๊ณง ์ ๊ณต ๋ ์์ ์ ๋๋ค.
์๋
ํ์ธ์ @benoj ,
ํดํน์์ด ์ฌ์ฉ์ ์ง์ PDF.js ์ค์ ์ ์ค์ ํ๋ ๊ธฐ๋ฅ์ด ์ด์ React-PDF 2.3.0์ ์ ์ฉ๋ฉ๋๋ค. ํฌ๊ฒ ๋ค๋ฅด์ง ์์ต๋๋ค.
import { setOptions, <WhateverElseYouNeed> } from 'react-pdf';
setOptions({
workerSrc: '/js/pdf.worker.js',
});
๋ค๊ฐ ์ข์ํ๊ธธ ๋ฐ๋!
@wojtekmaj ๊ต์ฅ ํ ๊ฒ์ ๋๋ค! ๊ฐ์ฌ :)
์ด๊ฒ์ด ์๋ ํ๋๋ก ์๋ํ๋์ง ํ์คํ์ง ์์ต๋๋ค.
setOptions ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์๋ํ์ง๋ง ์๋ฌด ์์ฉ์ด ์์ต๋๋ค.
๋ฐฑ์๋์์ ์ ๊ณตํ์ง ์๋ ๋น๋ ๋ฃจํธ์์ <hash>.worker.js
ํ์ผ์ ๊ณ์ ์์ฑํฉ๋๋ค.
prod webpack config ์์์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์์ต๋๋ค (ํด์๋ฅผ ์์ ๋ถ์ด์ง ์์์ต๋๋ค), ์ด์ํ๊ฒ๋ dev์์ ๋ฐ์ํ๊ณ ์์ต๋๋ค ...์ด ์์ธ์ ํ์
ํ๋ฉด ๋ค์๋ณด๊ณ ํฉ๋๋ค.
๋๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก @benoj ์๋ ์๋ฃจ์ ์ ์์งํ์ต๋๋ค.
์ฃผ๋ชฉํด์ผ ํ ์ค์ํ ์ ์ entry.webpack์ ์ ์ผํ ๋ชฉ์ ์ ์ฌ์ฉ์ ์ธก์์ ๊ตฌ์ฑ์์ด PDF.js ์์ ์๋ฅผ ํ์ฑํํ๋ ๊ฒ์ ๋๋ค. ๋นํ์ฑํํ๋ ค๋ ๊ฒฝ์ฐ ์ผ๋ฐ์ ์ธ ํญ๋ชฉ ์ธ entry.webpack์ ์ฌ์ฉํด์๋ ์๋ฉ๋๋ค.
๋นํ์ฑํํ๊ณ ์ถ์ง ์๊ณ ๋์ ์ผ๋ก ๊ฐ์ ธ ์ค๊ธฐ / ์ฐธ์กฐ๋๋ ๋ฐฉ๋ฒ์ ์กฐ๊ธ ๋ ์ ์ด ํ ์ ์์ต๋๋ค.
pdfjs
์ (๋ฅผ) window
์ ๊ฐ์ ธ ์ค๊ฑฐ๋ ์ฒจ๋ถํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
setOptions๊ฐ ์ปจํ
์คํธ์์ด ํธ์ถ๋๋๋ก ๊ตฌ์ฑ๋๋ ๋ฐฉ๋ฒ์ ๊ถ๊ธํดํ์ต๋๋ค.
์์์ ์ธ๊ธํ๋ฏ์ด pdfjs
์๋์ผ๋ก ๊ฐ์ ธ์ค๊ณ workerSrc๋ฅผ ์ง์ ํ๋ฉด ์๋ํ๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค.
// importing these on their own
import Document from 'react-pdf/build/Document';
import Page from 'react-pdf/build/Page';
// configuring pdfjs
const pdfjs = require('pdfjs-dist');
pdfjs.PDFJS.workerSrc = '/js/pdf.worker.js';
ํธ์งํ๋ค:
์์ค๋ฅผ ๋ณด๋ฉด ๋ด ๋ฌธ์ ๊ฐ entry.webpack
์์ ๊ฐ์ ธ ์ค๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ค์์ ์๋ ํ๋๋ก ์๋ํฉ๋๋ค!
import { Document, Page, setOptions } from "react-pdf/build/entry";
setOptions({
workerSrc: "/js/worker.pdf.js"
});
๋์๊ฒ ๊ด์ฐฎ์ ๋ณด์ธ๋ค;) ๋ฌผ๋ก ๋ก๋๋ฅผ ์ง์ ๋ณต์ฌํด์ผํ๊ธฐ ๋๋ฌธ์ ๋ ๋ง์ ๊ตฌ์ฑ์ํด์ผํ๋ ๊ฒฝ์ฐ.
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ์ด๊ฒ์ด ๊ธฐ๋ณธ ์ง์
์ ์ด๋ฏ๋ก from 'react-pdf'
์์ฑํ ์ ์์ต๋๋ค. :)
์ด ๋ฌธ์ ์ ์ง์ ์ง๋ฉดํฉ๋๋ค. ReactPDF๋ ์ ๋์ ์ผ๋ก ๋๋ฉ์ธ์ ๋ํ ๊ฒ์ด ์๋๋ผ ์๋ ๊ฒฝ๋ก์์ ์์ ์๋ฅผ๋ก๋ํ๋ ค๊ณ ํฉ๋๋ค. ๋๊ตฌ๋ ์ง ๊ทธ๊ฒ์ ๋ถ๋ฅํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ด๋์ด๊ฐ ์์ต๋๊น? ๋๋ webpack์ ๋๋ฌด ์ต์ํ์ง ์์ผ๋ฏ๋ก Laravel Mix๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๋ํ ์ฌ๊ธฐ์์ ๋๋ฌ์ต๋๋ค-๋ด ์ฑ์ /static
์ ์ ์์ฐ์ ์ ๊ณตํ์ง๋ง webpack์์ workerjs ํ์ผ์ ์์ฑ ํ ์ ์์ต๋๋ค.
@joshbrw , @tjwebb , ์ ์
setOptions
๊ฐ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๊ฑฐ๋ ๊ทธ๋์ ์ด๋๊ฐ๋ก ์ฎ๊ฒจ์ง ๊ฒ์ผ๋ก ๋ณด์ด๋ฏ๋ก ์์ ์ฃผ์ ์์๋ ์ด๋์ ๋ ์ด์ ์๋ํ์ง ์์ต๋๋ค. ๋ฌธ์๋ฅผ ์ฝ์ผ๋ฉด ๋ค์์ด ์๋ ํ ์ ์๋ค๊ณ ๋ฏฟ๊ฒ๋ฉ๋๋ค.
import { pdfjs } from 'react-pdf';
pdfjs.GlobalWorkerOptions.workerSrc = `/path/to/your/worker.js`
๊ทธ๋ฌ๋ DevTools์์ ์๋๋๋ ๊ฒฝ๋ก๊ฐ ์ฌ์ ํ ํ์ฌ URL์ ์๋์ ์ด๋ฉฐ ์ ๋์ ์ด์ง ์๊ธฐ ๋๋ฌธ์ ์๋ํ์ง ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ๋ฆฌ ์กํธ ์ฑ ๋ด์์ PDF๋ฅผ ๋ ๋๋งํ๊ธฐ ์ํด ์ด๊ฒ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. 'react-pdf'๊ฐ์ ธ ์ค๊ธฐ ๋๋ 'react-pdf / dist / entry.webpack'๋๋ pdfjs.GlobalWorkerOptions.workerSrc = 'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.js';
(์ฌ๊ธฐ์ '=`)๋ฅผ ์ฌ์ฉํ๋ ๋ก์ปฌ์์ ์ ์๋ํ์ง๋ง ์ฒซ ๋ฒ์งธ ๋๋ ์ธ ๋ฒ์งธ ์ต์
์ ๋ชจ๋ ์๋ํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ์ ์์ฐ.
ํ๋ก๋์ ์์ 'react-pdf'๊ฐ์ ธ ์ค๊ธฐ๋ฅผ ์ฌ์ฉํ๋ฉด pdf.worker.js๊ฐ URL / pdf.work.js์์ ํธ์ถ๋๋ฉฐ (์ํ) "์ทจ์๋จ"์ ๋๋ค. ๊ทธ๋ฐ ๋ค์ CDN์ ์ฌ์ฉํด ๋ณด์๊ณ ํ์ผ์ด ์ฑ๊ณต์ ์ผ๋ก๋ก๋๋์์ง๋ง ๋ ์ํฉ ๋ชจ๋์์ ํญ์ด ๋ฉ์ถ๊ณ ๊ฒฐ๊ตญ ์ถฉ๋์ด ๋ฐ์ํ์ต๋๋ค. devTool Sources์ "์ ์ฌ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์ถฉ๋ ์ ์ ์ผ์ ์ค์ง๋์์ต๋๋ค"๋ผ๋ ๋ฉ์์ง๊ฐ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๊บผ๋ด์ผํ๊ณ , ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ ํ ๋ชฐ๋์ต๋๋ค.
๋ค์ ๋ฌธ์ ๋ฅผ ์ฝ์์ต๋๋ค. 371 , 378- ๋ต๋ณ ์์ , pdf.js์ 8305
์
๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
๋น์ทํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง๋ง ๋์ผํฉ๋๋ค. ์ฝ์์ ์ค๋ฅ๊ฐ ํ์๋์ง ์๊ณ 404๊ฐ ๋ฐํ ๊ฐ์ผ๋ก ํ์๋์ง ์์ต๋๋ค.
์ฌ์ฉํ ๋ : import { Document, Page } from "react-pdf";
pdf ํ์ผ์ ๋ณผ ์ ์์ต๋๋ค.
ํ์ง๋ง import { Document, Page } from 'react-pdf/dist/entry.webpack';
์ฌ์ฉํ ๋ ํ์ผ์ ๋ณผ ์ ์์ต๋๋ค.
onDocumentLoadSuccess
ํธ์ถ ํ ์ ์ด ์์ผ๋ฉฐ Loading PDFโฆ
๋ฉ์์ง์ ํจ๊ป๋ก๋ ํ๋
๋ค์ ๋ฉ์๋๋ ํธ์ถ๋์ง ์์ต๋๋ค.
@ b-asaf ๋๋ก๋ ํนํ 404 ๋์ ํด๋ผ์ด์ธํธ ์ธก ๋ผ์ฐํ ์ด์๋ ์ต์ ์ฑ์์ HTML ํ์ด์ง๊ฐ ๋ฐํ๋๋ฏ๋ก ์ค์ HTTP 404 ์ค๋ฅ ์ฝ๋๊ฐ ํ์๋์ง ์๊ณ 200์ด ํ์๋ฉ๋๋ค.
๋๋ฌด ๊น๋ค๋กญ๊ธฐ ๋๋ฌธ์ PDF.js์ ๊ธฐ๋ณธ cdn์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
import { pdfjs } from 'react-pdf';
pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.js`;
์ฌ๊ธฐ์ ๋ชจ๋ ๋ต๋ณ์ ๊ฐ์ฌํ์ง๋ง CDN์ ์ฌ์ฉํ๋ ๋์
import { pdfjs } from 'react-pdf';
pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.js`;
๋๋ฉ์ธ ๊ฐ ์์ฒญ์ ํผํ๊ธฐ ์ํด ํ๋ก์ ํธ์ ์ถ๋ ฅ ํ์ผ์ ์ฌ์ฉํ๊ณ ์ถ์ง๋ง ์ค์ ํ๋ฉด ์๋ํ์ง ์์ต๋๋ค.
pdfjs.GlobalWorkerOptions.workerSrc = '/dist/vendors~pdfjsWorker.js';
์ด ๋๊ตฌ๋ฅผ ๋ง์ด ์ข์ํ์ง๋ง ์ ๋ ๊ฒฝ๋ก๋ฅผ ๋ฌด์ํ๋ ๊ฒ์ ์ค๋ฅ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. SPA ์ฑ์์ ์์ ์ค์ด๋ฉฐ http://example.com/check/id/language ์ ์ก์ธ์คํ๋ ค๊ณ ํ๋ฉด ํจํค์ง๊ฐ ์๋ํ์ง ์์ต๋๋ค.
๊ฐ์ฌ.
์ด๊ฒ์ CDN ๋ฌธ์ ๊ฐ ์๋๋ฉฐ ๋ด ๋ก์ปฌ ์ฑ ์ค ํ๋์์ ์คํ๋์ง๋ง ๋ค๋ฅธ ์ฑ์์๋ ์คํ๋์ง ์์ต๋๋ค.
๋ด ์ฑ ์ค ํ๋์์ react static์ ์ฌ์ฉํ์ฌ web-pack dev server๋ฅผ ํตํด ์คํ๋ฉ๋๋ค.
๋ค๋ฅธ ํ๋๋ webpack๊ณผ ํจ๊ป ๋ฒ๋ค๋ก ์ ๊ณต๋๋ ๋ ธ๋ / ์ต์คํ๋ ์ค ๋ฐฑ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ํ๋ฐํธ ์๋๋ ๋ค์ React์ ๋๋ค. ์๋ํ์ง ์์ต๋๋ค.
pdf ํญ๋ชฉ์ ๊ตฌ์ฑ์ ๋์ผํฉ๋๋ค.
์ด๊ฒ์ ๋ด ๋
ธ๋ / ์ต์คํ๋ ์ค ์น ํฉ ์ค์ ์ผ๋กํด์ผ ํ ์ผ์ด ์์์ ์๋ ค์ค๋๋ค.
๊ธํ ๋
ธ์ ๊ณผ ๊ด๋ จ์ด์์ ์ ์์ต๋๋ค.
์ด์จ๋ ; ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉด ๋ค์ ๋์ ์ค๊ฑฐ๋, ๋ฌด์จ ์ผ์ธ์ง ์๋ ์ฌ๋์ด ์์ผ๋ฉด ๊ณต์ ํด์ฃผ์ธ์.
๋๋ ๊ทธ๊ฒ์ ์๋ํ๋ค!
๋ด tsconfig์ ์ค์ ๋ commonjs๋ฅผ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์
๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ ธ์์ผํฉ๋๋ค.
import {Document, Page} from 'react-pdf/dist/umd/entry.webpack'
์ข์ํ์ง ์๋
import {Document, Page} from 'react-pdf' //BAD not working !
์ด์ ๋ด ๋ ธ๋ / ์ต์คํ๋ ์ค ์ฑ์์ ์๋ํฉ๋๋ค.
์ฌ์ฉ์๊ฐ ์๋ฒ๋ฅผ ๊ฐ๋ฐํ๊ณ ์ ์ ์ผ๋ก ๋ฐ์ํ๋ ๋ค๋ฅธ ์ฑ์์
๋ด tsconfig.json์ ์ค์ ๋ esnext๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ ์์
ํ๊ณ ์๋ค
import {Document, Page} from 'react-pdf';
์๋ํฉ๋๋ค!
์ฆ, ์ค์ ๋ ๋ชจ๋ ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๊ฐ์ ธ์์ผํฉ๋๋ค.
commonjs ์ฉ
` 'react-pdf'์์ {Document, Page} ๊ฐ์ ธ ์ค๊ธฐ
esnext ์ฉ
import {Document, Page} from 'react-pdf/dist/umd/entry.webpack'
@nickjohngray react-pdf/dist/umd/entry.webpack
์์ ๊ฐ์ ธ ์ค๋ ค๊ณ ํ๋๋ฐ Typescript๊ฐ ํ์ ๋ชจ๋์ด ์กด์ฌํ์ง ์๋๋ค๊ณ ๋ถํํฉ๋๋ค. ์ต์ ๋ฒ์ ์ธ @types/react-pdf
๋ฒ์ 4.0.6์ด ์ค์น๋์ด ์์ต๋๋ค. ์ ํ ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐ ํ์ต๋๊น?
typecheck๋ฅผ ์๋ฃํ๋ ๋ฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ฉด ์์
์๊ฐ ์ ์ปดํ์ผ๋๊ณ ์๊ณ dist/umd
์ฌ์ฉํ ๋ PDF๊ฐ๋ก๋ ๋ฐ ํ์๋๋์ง ํ์ธํ ์ ์์ง๋ง typecheck๊ฐ ์๋ฃ๋๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณ IDE๋ ๋ถํ :
Error:(4, 30) TS7016: Could not find a declaration file for module 'react-pdf/dist/umd/entry.webpack'.
E:/Users/Rob/workspace/gTove/node_modules/react-pdf/dist/umd/entry.webpack.js' implicitly has an 'any' type.
If the 'react-pdf' package actually exposes this module, consider sending a pull request to amend 'https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/react-pdf`
์๋
ํ์ธ์ @RobRendell
๋๋ ์ ํ ์ค๋ฅ๊ฐ ์์์ต๋๋ค.
์ด ์ ํ ์ค๋ฅ๋ก ์ธํด ์ค์ง๋๋ ๊ฒฝ์ฐ any ์ ํ์ ์ฌ์ฉํ๊ณ ์๋ํ๋์ง ํ์ธํ์ญ์์ค.
@nickjohngray any
ํ์์ผ๋ก ์ฌ์ฉํ ์๋ ์์ง๋ง (๊ฐ์ ธ ์ค๊ธฐ ๋ฌธ), ๊ฐ์ ธ ์ค๊ธฐ ์์ // @ts-ignore
๋ผ๋ ์ค์ ์ถ๊ฐํ์ฌ ์ค๋ฅ๋ฅผ ๋ฌด์ํ ์ ์์ต๋๋ค. ๊ทธ๋ ๊ฒํ๋ฉด ๋ชจ๋ ๊ฒ์ด ์ ์๋ํฉ๋๋ค.
์ด์์ ์ผ๋ก๋ ์ ์ ํ ์ ํ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ์ถ์ต๋๋ค. .d.ts ํ์ผ์ ์ถ๊ฐํ์ฌ ๋ชจ๋ ์ ์ธ์ ํ์ฅํ๋ ค๊ณ ํฉ๋๋ค.
import {pdfjs, Document, Page, Outline} from 'react-pdf';
declare module 'react-pdf/dist/umd/entry.webpack' {
export {pdfjs, Document, Page, Outline};
}
...ํ์ง๋ง ๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ Typescript์ ๋ฅ์ํ์ง ์์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ ์ ์์ต๋๋ค.
์ง๊ธ ๋ฌ์ฑํด์ผ ํ ๋ง๊ฐ์ผ์ด ๋ช ๊ฐ์ง ์์ต๋๋ค. ๋ด๊ฐ ๋๋๋ฉด ๋์ ์ค ์์์ด
์ ๋ฌผ๊ฑด . ๋ฌธ์ ๋ ์๊ณ ์ง์ฆ๋๋ ์ ํ์ ๋ฌธ์ ์ฌ์ผํฉ๋๋ค.
๋๋ typescript๋ฅผ ์์ ํ ์ง์ํ์ง ์๋ libs์ ๋ํ ํจ์ค์์ ๋ฐ๊ฒฌํ์ต๋๋ค.
๊ทธ๋ค์ ์ํด ์ ํ์ ์์
ํ๋ ๋ฐ ์๊ฐ์ ํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ๋ด ์๊ฐ์ ์ ํ๋์ด ์๊ณ
ํฅ ์๋ฉ์ด ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋ค๊ณ ๊ณ ์น๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค. ๋๋ ๋น์ ์ด ๊ทธ๋ ๊ฒ ์ด๊ตฌํฉ๋๋ค
๋๊ฐ๋ค . ๐
๊ณ ๋ง์ ๋.
์์์ผ, 2020 ๋ 9 ์ 28 ์ผ, ์คํ 8:01 Rob Rendell, [email protected] ์์ฑ :
@nickjohngray https://github.com/nickjohngray ๋๋ ์ ํ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค
(์ด๊ฒ์ import ๋ฌธ์ ๋๋ค), ๊ทธ๋ฌ๋ //๋ผ๋ ์ค์ ๊ฐ์ ธ ์ค๊ธฐ ์ ์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
@ ts-ignore๋ ์ค๋ฅ๋ฅผ ๋ฌด์ํฉ๋๋ค. ๊ทธ๋ ๊ฒํ๋ฉด ๋ชจ๋ ๊ฒ์ด ์ ์๋ํฉ๋๋ค.์ด์์ ์ผ๋ก๋ ์ ์ ํ ์ ํ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ์ถ์ต๋๋ค. ๋๋ ๋ ธ๋ ฅํ๊ณ ์๋ค
.d.ts ํ์ผ์ ์ถ๊ฐํ์ฌ ๋ชจ๋ ์ ์ธ์ ํ์ฅํฉ๋๋ค.'react-pdf'์์ {pdfjs, Document, Page, Outline} ๊ฐ์ ธ ์ค๊ธฐ;
์ ์ธ ๋ชจ๋ 'react-pdf / dist / umd / entry.webpack'{
{pdfjs, ๋ฌธ์, ํ์ด์ง, ๊ฐ์} ๋ด๋ณด๋ด๊ธฐ;
}...ํ์ง๋ง ๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ๋ฅ์ํ์ง ์๋ค
Typescript์์ ๊ทธ๊ฒ ๋ฌด์จ ์ผ์ธ์ง ์๊ธฐ์ ์ถฉ๋ถํฉ๋๋ค.โ
๋น์ ์ด ์ธ๊ธ ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/wojtekmaj/react-pdf/issues/97#issuecomment-699818238 ,
๋๋ ๊ตฌ๋ ์ทจ์
https://github.com/notifications/unsubscribe-auth/AD3TSIQUIASADKB6UASTNRDSIAYEZANCNFSM4ECOS2TQ
.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋๋ ๊ทธ๊ฒ์ ์๋ํ๋ค!
๋ด tsconfig์ ์ค์ ๋ commonjs๋ฅผ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์
๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ ธ์์ผํฉ๋๋ค.
import {Document, Page} from 'react-pdf/dist/umd/entry.webpack'
์ข์ํ์ง ์๋
import {Document, Page} from 'react-pdf' //BAD not working !
์ด์ ๋ด ๋ ธ๋ / ์ต์คํ๋ ์ค ์ฑ์์ ์๋ํฉ๋๋ค.
์ฌ์ฉ์๊ฐ ์๋ฒ๋ฅผ ๊ฐ๋ฐํ๊ณ ์ ์ ์ผ๋ก ๋ฐ์ํ๋ ๋ค๋ฅธ ์ฑ์์
๋ด tsconfig.json์ ์ค์ ๋ esnext๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ ์์ ํ๊ณ ์๋ค
import {Document, Page} from 'react-pdf';
์๋ํฉ๋๋ค!
์ฆ, ์ค์ ๋ ๋ชจ๋ ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๊ฐ์ ธ์์ผํฉ๋๋ค.
commonjs ์ฉ
` 'react-pdf'์์ {Document, Page} ๊ฐ์ ธ ์ค๊ธฐ
esnext ์ฉ
import {Document, Page} from 'react-pdf/dist/umd/entry.webpack'