Webpackμ μ¬μ©νμ¬ request
λ₯Ό λ‘λνλ €κ³ νλλ° λ€μ μ€λ₯κ° νμλ©λλ€.
λλ μ΄κ²μ΄ browserifyλ₯Ό μ¬μ©νμ¬ λΈλΌμ°μ μμ μλνλ€λ κ²μ 보μκ³ λ΄κ° 무μμ μλͺ»νκ³ μλμ§ κΆκΈνμ΅λλ€. μλ§λ browserifyλ μ΄ λ¬Έμ λ₯Ό μΌμΌν€λ webpackκ³Ό λ€λ₯Έ λ°©μμΌλ‘ μ’ μμ±μ μ²λ¦¬ν©λλ€. μ΄λ€ μμ΄λμ΄?
+1, μ΄κ²λ 보κ³
μ°μΆ:
ERROR in ./~/request/lib/har.js
Module not found: Error: Cannot resolve module 'fs' in /absolute/path/to/project/node_modules/request/lib
@ ./~/request/lib/har.js 3:9-22
ERROR in ./~/request/~/tunnel-agent/index.js
Module not found: Error: Cannot resolve module 'net' in /absolute/path/to/project/node_modules/request/node_modules/tunnel-agent
@ ./~/request/~/tunnel-agent/index.js 3:10-24
ERROR in ./~/request/~/tunnel-agent/index.js
Module not found: Error: Cannot resolve module 'tls' in /absolute/path/to/project/node_modules/request/node_modules/tunnel-agent
@ ./~/request/~/tunnel-agent/index.js 4:10-24
ERROR in ./~/request/~/forever-agent/index.js
Module not found: Error: Cannot resolve module 'net' in /absolute/path/to/project/node_modules/request/node_modules/forever-agent
@ ./~/request/~/forever-agent/index.js 6:10-24
ERROR in ./~/request/~/forever-agent/index.js
Module not found: Error: Cannot resolve module 'tls' in /absolute/path/to/project/node_modules/request/node_modules/forever-agent
@ ./~/request/~/forever-agent/index.js 7:10-24
ERROR in ./~/request/~/tough-cookie/lib/cookie.js
Module not found: Error: Cannot resolve module 'net' in /absolute/path/to/project/node_modules/request/node_modules/tough-cookie/lib
@ ./~/request/~/tough-cookie/lib/cookie.js 23:10-24
ERROR in ./~/request/~/form-data/lib/form_data.js
Module not found: Error: Cannot resolve module 'fs' in /absolute/path/to/project/node_modules/request/node_modules/form-data/lib
@ ./~/request/~/form-data/lib/form_data.js 7:9-22
ERROR in ./~/request/~/har-validator/~/is-my-json-valid/~/jsonpointer/jsonpointer.js
Module not found: Error: Cannot resolve module 'console' in /absolute/path/to/project/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer
@ ./~/request/~/har-validator/~/is-my-json-valid/~/jsonpointer/jsonpointer.js 1:14-32
λλ κ·Έκ²μ μμ. λ¬Έμ λ Webpackμ΄ λ κΈ°λ³Έμ μΈ νΉμ±μΌλ‘ μΈν΄ browserifyμ λ¬λ¦¬ λͺ κ°μ§ μΆκ° ꡬμ±μ΄ νμνλ€λ κ²μ λλ€. ν μ€νΈλ₯Ό μ±κ³΅μ μΌλ‘ μ€νν λ°©λ²μ μμ λΆκΈ° λ° diffλ₯Ό μ°Έμ‘°νμμμ€.
https://github.com/request/request/compare/master...pho3nixf1re:webpack-tests
λ΄ κ³νμ κ·Έκ²μ μ체 μΉ΄λ₯΄λ§ ν μ€νΈλ‘ λ°κΎΈκ³ λ€λ₯Έ μ¬λλ€μ΄ μμ λ‘ μ¬μ©ν μ μλλ‘ PRμ μ μΆνλ κ²μ λλ€. λν κ°λ°μ΄ μ§νλ¨μ λ°λΌ ν₯ν λ¬Έμ λ₯Ό λ°κ²¬ν μ μμ΅λλ€.
μ, κ°μ κ²μ μ°Ύμμ΅λλ€. κ°μ¬ν©λλ€. μ΄κ²μ μ°μ°ν λ°κ²¬ν λ€λ₯Έ μ¬λμ μν΄ κ΄λ ¨ μΉν© λ¬Έμλ λ€μκ³Ό κ°μ΅λλ€. http://webpack.github.io/docs/configuration.html#node
@jaredmcdonald κ°μ¬ν©λλ€ :)
@pho3nixf1re webpackμΌλ‘ ν μ€νΈ μμ²μ λν PRμ μ μΆνλ©΄ μ’μ κ²μ λλ€(browserify λμ μΆκ° ν μ€νΈ) :+1:
λ€! λ ~νλ €κ³ νλ€. λΉ λ₯Έ κ°λ μ¦λͺ μΌλ‘ λ΄ μ§μ μμλ§ κ΅μ²΄νμ΅λλ€. μ΄λ² μ£Όλ§μ ν κ²μ.
λΆννλ json webpack λ‘λλ₯Ό μΆκ°ν΄λ μ΄ λ¬Έμ κ° ν΄κ²°λμ§ μμμ΅λλ€.
μ¬κΈ°μμλ κ°μ λ¬Έμ μ λλ€.
ν΄κ²°μ±
: webpackμ΄ *.json νμΌμ μ²λ¦¬ν μ μλλ‘ json-loader
μ€μΉν©λλ€. κ·Έλ° λ€μ ν΄λΉ λ‘λμ μ node
κ°μ²΄λ₯Ό webpack.config.js
κ³Ό κ°μ΄ μΆκ°ν©λλ€.
$ npm install --save-dev json-loader
μΉν©.config.js
var path = require('path');
module.exports = {
entry: 'index',
output: {
path: path.join(__dirname, 'scripts'),
filename: 'bundle.js'
},
module: {
loaders: [
{ test: /\.json$/, loader: 'json-loader' }
]
},
resolve: {
extensions: ['', '.webpack.js', '.web.js', '.js']
},
node: {
console: 'empty',
fs: 'empty',
net: 'empty',
tls: 'empty'
}
};
node: { ... }
κ°μ²΄λ₯Ό μΆκ°νλ©΄ μ€λ₯κ° λ°©μ§λμ§λ§ λΈλΌμ°μ μμ console
λ₯Ό μ¬μ©ν μ μμ΅λλ€. μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ λ°©λ²μ΄ μμ΅λκΉ?
λλ λ°©κΈ κ·Έκ²μ μμ λμ΅λλ€.
node: {
console: true
}
μ΄κ²μ μ μκ² ν° λμμ΄ λμμ΅λλ€. μμ λͺ¨λ λΆλ€κ» κ°μ¬λ립λλ€.
λͺ¨λ κ°μ¬ν©λλ€. μ§μ λΆλͺμ³€μ΅λλ€.
μ΄λ€ νμ΄?
λλ webpack & requestλ₯Ό μ¬μ©νκ³ μμΌλ©° μ¬κΈ°μμ λͺ¨λ μ€λ₯κ° λ°μνμ΅λλ€.
json-loader & node μμλ‘ μ루μ
μ μλνμ§λ§ μ¬μ ν μ€λ₯κ° λ°μν©λλ€...
μλ
. λμμ΄ νμν΄ node js mysqlμ λ°μ μ±μ κ²°ν©νκ³ μΆμ΅λλ€. νμ§λ§ μΉν©μ μ€νν λ 'net' λͺ¨λμ ν΄κ²°ν μ μλ€λ μ€λ₯ λ©μμ§κ° λνλ©λλ€.
μλ μ½λλ₯Ό μ°Έμ‘°νμμμ€.
import React from 'react'
import ReactDOM from 'react-dom'
import mysql from 'mysql'
export default class Server extends React.Component{
render(){
return(
<div>
<div>Success Inserting New Data</div>
<div>Company Name: {this.props.name}</div>
<div>Email: {this.props.email}</div>
</div>
);
}
}
var company_data = {
name: 'Company Name Sample',
email: '[email protected]'
};
let connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '',
database: 'earnmoredoless'
});
connection.connect();
let sql = connection.query('insert into account set ?', data, function(err, res){
`//success`
`if(!err){`
`ReactDOM.render(`
`<Server data={company_data} />,`
`document.querySelector('#app')`
`);`
`}else{`
`console.log('Failed inserting new data.');`
`}`
});
+1
μ΄κ²μ λλ₯Ό ꡬνλ€
+1
μ μ₯λμμ΅λλ€!
+1 dotenv
λ¬Έμ κ° μμμ΅λλ€. μμ μ루μ
μΌλ‘ λ΄ λ¬Έμ κ° ν΄κ²°λμμ΅λλ€. κ°μ¬ ν΄μ!
{ fs: 'empty' }
λ
Έλλ₯Ό μΆκ°νλ©΄ cannot resolve module 'fs'
λ¬Έμ κ° ν΄κ²°λμμ§λ§ μ΄μ μ½μμ TypeError: fs.readFileSync is not a function
μ€λ₯κ° μμ΅λλ€. es6 babel λ³νκΈ°μ ν¨κ» dotev
λ° webpack
λ₯Ό μ¬μ©νλ €κ³ νλ λμ μ΄ λ¬Έμ κ° λ°μνμ΅λλ€. https://github.com/motdotla/dotenv/issues/114μ μ€λͺ
λ λλ‘ μΉν©μ import 'dotenv/config';
λ‘ κ°μ Έμ€κΈ°
μμ λ Έλ {} μ루μ μ΄ λ΄ webpack.config.jsλ₯Ό λμμ§λ§ λ€μ μ€λ₯μ ν¨κ» μ΄μ μ’ μλ λ΄ ββkarma.conf.jsκ° μμλμμ΅λλ€.
ReferenceError: μ격ν λͺ¨λλ μ μ μμ± '_crypto'μ μμμ μμ±μ κΈμ§ν©λλ€.
λꡬλ μ§ dotenv
μ ν¨κ» μλνλλ‘ μ΄κ²μ ν΄κ²°νμ΅λκΉ?
webpackμ μ¬μ©νλ React μ±μμ request
μ λ°λΌ λ¬λΌμ§λ node-soap
μ μ¬μ©νλ λμ μ΄ λ¬Έμ κ° λ°μν©λλ€. λ΄ webpack ꡬμ±μ μμ νλ €κ³ μλνμ΅λλ€.
node: {
console: true,
fs: 'empty',
net: 'empty',
tls: 'empty'
}
μμμ μ μν κ²μ²λΌ λ¬Έμ κ° ν΄κ²°λμ§ μμμ΅λλ€. μ¬μ ν μ΄λ¬ν μ€λ₯κ° νμλ©λλ€.
λ€λ₯Έ μ¬λλ€λ κ°μ λ¬Έμ λ₯Ό λ³΄κ³ μμ΅λλ€.
https://gitter.im/vpulim/node-soap/archives/2016/04/13
https://gitter.im/vpulim/node-soap/archives/2016/01/11
κ·Έλ¦¬κ³ λ΄κ° μλ ν μ무λ μμ§ ν΄κ²°μ± μ΄ μμ΅λλ€. μ λ webpackμ μ΅μνμ§ μμ§λ§ μμ§ ν΄κ²° λ°©λ²μ΄ μλ μ¬λμ΄ μλ€λ©΄ μ΄λ² μ£Όλ§μ μκ°μ΄ μμΌλ©΄ λ λλ²κΉ ν μ μλλ‘ μΌν¬λ₯Ό λ©΄λνλ €κ³ ν κ²μ λλ€.
@kevhuang @sailingthoms @MrOutis λλ @gaearon μμ§ μ΄μ λν ν΄κ²°μ±
μ μ°Ύμ μ¬λμ΄ μμ΅λκΉ? μλλ©΄ node-soap
/ request
λ₯Ό Reactμ ν¨κ» μ¬μ©νκΈ° μν΄ μνν΄μΌ ν λ€λ₯Έ μμ
μ λν μμ΄λμ΄κ° μμ΅λκΉ? (λ°°μΆνμ§ μκ³ create-react-app
λ₯Ό μ¬μ©νλ κ²μ΄ μ’μ΅λλ€).
@screendriver _node κ°μ²΄_μ λν μ 보λ μ΄λμμ μ»μμ΅λκΉ? λλ λ¬Έμμμ κ·Έκ²μ λ³Ό μ μμ΅λλ€.
@richburdon , @lucasbento λμμ΄ λ μκ° μμ΅λκΉ?
@garethderioth μ£μ‘ν©λλ€ κΈ°μ΅μ΄ μλμ. λ무 μ€λλμμ΅λλ€.
그건 κ·Έλ κ³ : κ·Έ λμ λλ HTML5 fetch APIμ μ΄ ν΄λ¦¬νμ AJAX μμ²μ μ¬μ©νκ³ μμ΅λλ€.
@garethderioth
@jaredmcdonald λ μμ https://github.com/request/request/issues/1529#issuecomment -90347445μμ λ§νμ΅λλ€.
μ, κ°μ κ²μ μ°Ύμμ΅λλ€. κ°μ¬ν©λλ€. μ΄κ²μ μ°μ°ν λ°κ²¬ν λ€λ₯Έ μ¬λμ μν΄ κ΄λ ¨ μΉν© λ¬Έμλ λ€μκ³Ό κ°μ΅λλ€. http://webpack.github.io/docs/configuration.html#node
그건 κ·Έλ κ³ : κ·Έ λμ λλ HTML5 fetch APIμ μ΄ ν΄λ¦¬νμ AJAX μμ²μ μ¬μ©νκ³ μμ΅λλ€.
React μ± μ¬μ©μ μμ±: CRAμλ μ΄λ―Έ window.fetch
ν΄λ¦¬νμ΄ ν¬ν¨λμ΄ μμΌλ―λ‘ μ¬μ© μ¬λ‘λ₯Ό μΆ©μ‘±νλ κ²½μ° request
λμ μμ νκ² μ¬μ©ν μ μμ΅λλ€.
@screendriver @josiahsprague λμ :
node: {
console: true,
fs: 'empty',
net: 'empty',
tls: 'empty'
}
λλ μΌλ€:
target: 'node',
κ·Έκ²μ λ΄ λͺ¨λ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€.
νΈμ§: https://webpack.github.io/docs/configuration.html#target μμ μμΈν λ΄μ©μ μ½μ μ μμ΅λλ€.
@gaearon μ 3μ λΌμ΄λΈλ¬λ¦¬μ μμ‘΄μ±μ΄ νμνλ€λ©΄?
μ²μλΆν° ν΄μΌ νλ κ²μ²λΌ create-react-appμ μ μ₯μμμ λ¬Έμ μ κΈ° :/
μμ κ²μλ μ€λ₯ μ€ν¬λ¦°μ·μ κ΄λ ¨μ΄ μμΌλ©° ν΄λΉ μ€λ₯λ₯Ό μ½λ μ¬λμ΄λΌλ©΄ λꡬλ μ μ μμ΅λλ€. π μ΄μ¨λ , @pedzed μ λκΈμ μλ λ κ°μ§ μ루μ
μ΄ λͺ¨λ μ μκ² ν¨κ³Όκ° μλ κ² κ°μ΅λλ€. λ λ€λ₯Έ μ μ¬μ μΈ μ루μ
μ μν©μ λ°λΌ target: 'node-webkit
λλ λ€λ₯Έ μ μ¬ν μ΅μ
μ μ¬μ©νλ κ²μ
λλ€.
μ κ²½μ°μλ node-soap
μμ browser-soap
λ‘ μ ννμ§λ§ λͺ¨λ μ¬λμκ² μ μ©λλ κ²μ μλλλ€.
λλ μ΄κ²κ³Ό λΉμ·ν λ€λ₯Έ λ¬Έμ κ° μμμ§λ§ κ·Έκ²μ κ²½νν μμλ μ¬λμ μν΄ socketio/socket.io-client/issues/933μ΄λμμ΅λλ€.
+1
κ°μ¬ ν΄μ!
@screendriver & @kilometersκ° μ 곡ν κ²μ μ¬μ©νμ¬ μ½κ°μ λ³κ²½μ νμ΅λλ€(κ°μ¬ν©λλ€!).
Webpackμ λΉ νμ₯μκ° μμΌλ©΄ λΆννμ§λ§ λλΆλΆμ κ²½μ° μ΄κ²μ΄ νμνμ§ μλ€κ³ μκ°ν©λλ€.
````
var κ²½λ‘ = νμ('κ²½λ‘')
var μμ² = μꡬ('μμ²')
var μΉν© = νμ('μΉν©')
module.exports = {
νλͺ©: './src/main.js',
μΆλ ₯: {
κ²½λ‘: path.resolve(__dirname, './dist'),
publicPath: '/dist/',
νμΌ μ΄λ¦: 'build.js'
},
λͺ¨λ: {
κ·μΉ: [
{
ν
μ€νΈ: /.json$/,
λ‘λ: 'json-λ‘λ'
}
]
},
ν΄κ²°νλ€: {
/ νμ₯μ: ['.webpack.js', '.web.js', '.js'] /
}
λ
Έλ: {
μ½μ: μ¬μ€,
fs: 'λΉμ΄ μμ',
κ·Έλ¬Ό: 'λΉμ΄ μμ',
tls: 'λΉμ΄ μμ'
}
}
````
λ²λ€ μ½λμ μν₯μ μ£Όμ§ μλ κ°μ₯ μ¬μ΄ μ루μ :
μ€ν 리λΆμ λ¬Έμ κ° μκ³ .storybook/webpack.config.js
νκ³ λ€μμ μΆκ°νμ¬ νμ₯ν μ μμ΅λλ€.
// Load the default config generator.
const genDefaultConfig = require('@kadira/storybook/dist/server/config/defaults/webpack.config.js');
module.exports = function (config, env) {
const newConfig = genDefaultConfig(config, env);
// Extend to resolve fs issues
newConfig.node = {
fs: 'empty'
};
return newConfig;
};
node: {
console: true,
fs: 'empty',
net: 'empty',
tls: 'empty'
}
μμ μ½λλ₯Ό μ¬μ©νλ©΄ μ€λ₯κ° ν΄κ²°λμμ§λ§
fs.writeFile('/home/react-hello-world/test.txt', 'aaa', function(err) { alert(err); });
fs.writeFileμ΄ μλνμ§ μμ΅λλ€. ν΄κ²°μ± μ μ£Όμμμ€.
@chandrasekarb λ 'λΉμ΄ μμ' λμ fsλ₯Ό trueλ‘ μ€μ νλ €κ³ μλν©λλ€.
target: 'node',
λλ₯Ό μν΄ μΌνμ΅λλ€ :department_store:
μ΄ λ¬Έμ κ° λ°μνλλ° μλ² μΈ‘ λ λλ§μ μν΄ μ΄μ€ ν΄λΌμ΄μΈνΈ/μλ² κ΅¬μ±μ μ€ννκ³ μμκΈ° λλ¬Έμ λλ€. μλ² μΈ‘ λ λλ§ κ΅¬μ±μ λμ: 'λ Έλ'λ‘ νμλμμ§λ§ ν΄λΌμ΄μΈνΈ ꡬμ±μλ μ§μ λμ§ μμμ΅λλ€. ν΄λΌμ΄μΈνΈ ꡬμ±μ target: 'web'μ μΆκ°νλλ° μ€λ₯κ° μ¬λΌμ‘μ΅λλ€.
μ΄ λ¬Έμ λ μ΅κ·Ό νλμ΄ μμκΈ° λλ¬Έμ μλμΌλ‘ μ€λλ κ²μΌλ‘ νμλμμ΅λλ€. λ μ΄μμ νλμ΄ μμΌλ©΄ νμλ©λλ€. κ·νμ κΈ°μ¬μ κ°μ¬λ립λλ€.
μμ²μ΄ νμ¬ μ μ§ κ΄λ¦¬ λͺ¨λμ μμΌλ©° μλ‘μ΄ κΈ°λ₯μ λ³ν©νκ±°λ μ΄ λ²κ·Έλ₯Ό ν΄κ²°νμ§ μμ΅λλ€. μμΈν λ΄μ©μ #3142λ₯Ό μ°Έμ‘°νμΈμ.
Nuxt
(λλ λ
Έλ)μ ν¨κ» jQuery
λ₯Ό μ¬μ©νλ €κ³ νλ κ²κ³Ό λμΌν λ¬Έμ κ° μμμ΅λλ€. λ¬Έμ λ jQuery
λ° Bootstrap
μ€κ³ jsdom
μΆκ°νλ€λ κ²μ
λλ€. nuxt.config.js
head
μΉμ
μμ μ§μ λΌμ΄λΈλ¬λ¦¬λ₯Ό κ°μ Έμ€λ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€. λ λ€λ₯Έ λ°©λ²μ nuxt κ΅¬μ± νλ¬κ·ΈμΈμμ client mode
λ₯Ό μ€μ νλ κ²μ
λλ€. λκ΅°κ°μκ² λμμ΄ λκΈ°λ₯Ό λ°λλλ€.
κ°μ₯ μ μ©ν λκΈ
μ¬κΈ°μμλ κ°μ λ¬Έμ μ λλ€.
ν΄κ²°μ± : webpackμ΄ *.json νμΌμ μ²λ¦¬ν μ μλλ‘
json-loader
μ€μΉν©λλ€. κ·Έλ° λ€μ ν΄λΉ λ‘λμ μnode
κ°μ²΄λ₯Όwebpack.config.js
κ³Ό κ°μ΄ μΆκ°ν©λλ€.μΉν©.config.js