webpack 3.0構成説明
16882 ワード
webpack
私たちはwebpackを使って主に以下の機能を完成します:1.jsコードをコンパイル2.jsコード3を抽出、分割する.sassコード4をコンパイルする.圧縮jsコード5.圧縮cssコード6.ページ7を生成する.デバッグ8.その他
Webpack調製
Webapck配合で最も主要なのは4つの部分です:*entry*output*loaders*plugins
Entry
entryは、構築全体の開始点を定義します.
ここでは3つの開始点を定義し、keyはこのchunkの名前で、後ろにこのchunkの開始点があります.
Output
outputはwebpackのパッケージ結果を出力する方法を定義しています
Filename:entrypointごとに1つの出力ファイルchunkFilename:コード分割後のファイル名publicPath:すべてのリソースのパブリッシュパスを指定する
loaders
loaderはコンパイラと考えられ、es 6をes 5にコンパイルし、babel-loaderを介してsassをcssにコンパイルし、sass-loaderのすべてのloaders調製によって定義される.
plugins
pluginsはwebpackが他の機能を完成するメカニズムであり、例えばページを生成し、html-webpack-pluginを使用し、圧縮jsはUglifyJsPlugginを使用する.
コンパイルJS
コンパイルes 6
preset
a preset is a set of plugins used to support particular language features
jsxのコンパイル
react,flow presetを追加
antdのダイナミックロードを増やす
import pluginを追加
コンパイルriot
コンパイルpreact
次のpluginを追加します.
JSコードの抽出
通常、entry pointに含まれるモジュールは、対応する出力ファイルにパッケージされます.しかし、異なるentry pointには同じモジュールが含まれている場合があります.同じモジュールを抽出すれば、出力サイズ全体を小さくすることができます.CommonsChunkPluginはこれを達成するためです.
コード分割
私たちが開発したのは1ページのアプリケーションで、デフォルトでは、各ページがappにパッケージされます.jsでは、ページを開くときに、すべてのページのコードをロードしてから表示する問題があります.そのため、必要なページをロードするためにコード分割が必要です.Webpack自体はコード分割機能を提供しています.webpack 1とwebpack 2+の実現は違います.*webpack 1はrequireを使用します.Ensure(),require(*)*webpack 2 import()を使用して、importはPromise*ensureを返してchunkに名前を付けることをサポートして、importはサポートしません
コンパイルSASS
コンパイルsassは比較的簡単で、babelと同様にsass-loaderを呼び出せばよい.sass loaderの役割はsassをcssにコンパイルすることですが、webpackはcssをパッケージ化し、いくつかの調製作業が必要です.
パッケージcss
cssをパッケージ化するには、いくつかのloader*style-loaderが必要です.
TO
postcss 、cssnanoプラグインを し、このプラグインはcssコードを するために されます.
これで、 なcssができます.これらのスタイルは、ページに
JS
UglifyJSPluginの
CSS
css-loaderにminimize=trueを える
その のリソース、 、フォントのロード
のリソースをロードするには、 に2つのloader:*file-loaderを します.
CSSファイルの
cssファイルを し、extract-text-webpack-pluginを してこのpluginを2ステップに け、1つはpluginsの に します.もう1つは、
HTMLの
これで、すべてのリソースの が い、HTMLが されます.html-webpack-pluginを して ページを します.HtmlWebpackPluginは、このページで されるすべてのjs、cssなどを し、 する
その
のインポート
ページにjqueryをロードした 、ページにロードされます.コードで するには、ページにロードされています.コードで する は、webpackが$をどのように するかを えます.externalsの はこれです.
私たちはwebpackを使って主に以下の機能を完成します:1.jsコードをコンパイル2.jsコード3を抽出、分割する.sassコード4をコンパイルする.圧縮jsコード5.圧縮cssコード6.ページ7を生成する.デバッグ8.その他
Webpack調製
Webapck配合で最も主要なのは4つの部分です:*entry*output*loaders*plugins
Entry
entryは、構築全体の開始点を定義します.
webpackConfig.entry = {
normalize: [ paths.client('normalize') ],
vendor : config.compiler_vendor,
app: paths.client('main.js')
}
ここでは3つの開始点を定義し、keyはこのchunkの名前で、後ろにこのchunkの開始点があります.
Output
outputはwebpackのパッケージ結果を出力する方法を定義しています
webpackConfig.output = {
filename: `[name].[hash].js`,
chunkFilename: `[id].[name].[hash].js`,
path: 'dist',
publicPath: 'http://one.jushenghua.com/'
}
Filename:entrypointごとに1つの出力ファイルchunkFilename:コード分割後のファイル名publicPath:すべてのリソースのパブリッシュパスを指定する
loaders
loaderはコンパイラと考えられ、es 6をes 5にコンパイルし、babel-loaderを介してsassをcssにコンパイルし、sass-loaderのすべてのloaders調製によって定義される.
// webpack1
module.loaders = [
// loaders
{
test: /\.coffee$/,
loader: 'coffee'
},
{
test: /\.css$/
loaders: [
'style',
'css'
]
}
]
// webpack 2+
module.rules = [
// loaders
{
test: /\.coffee$/,
loader: 'coffee-loader'
},
{
test: /\.css$/,
use: [
{
loader: 'style-loader'
},
{
loader: 'css-loader'
}
]
}
]
plugins
pluginsはwebpackが他の機能を完成するメカニズムであり、例えばページを生成し、html-webpack-pluginを使用し、圧縮jsはUglifyJsPlugginを使用する.
コンパイルJS
コンパイルes 6
webpackConfig.module.rules = [{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
loader: 'babel-loader',
options: {
cacheDirectory: true,
plugins: ['transform-runtime'],
presets: ['es2015', 'stage-0']
}
}]
preset
a preset is a set of plugins used to support particular language features
jsxのコンパイル
react,flow presetを追加
webpackConfig.module.rules = [{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
loader: 'babel-loader',
options: {
cacheDirectory: true,
plugins: ['transform-runtime'],
presets: ['es2015', 'react', 'stage-0', 'flow']
}
}]
antdのダイナミックロードを増やす
import pluginを追加
webpackConfig.module.rules = [{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
loader: 'babel-loader',
options: {
cacheDirectory: true,
plugins: ['transform-runtime', ['import', { libraryName: 'antd', style: true }]],
presets: ['es2015', 'react', 'stage-0']
}
}]
コンパイルriot
es2015-riot
presetを使用コンパイルpreact
次のpluginを追加します.
['transform-react-jsx', { 'pragma': 'h' }]
JSコードの抽出
通常、entry pointに含まれるモジュールは、対応する出力ファイルにパッケージされます.しかし、異なるentry pointには同じモジュールが含まれている場合があります.同じモジュールを抽出すれば、出力サイズ全体を小さくすることができます.CommonsChunkPluginはこれを達成するためです.
webpackConfig.plugins.push(
new webpack.optimize.CommonsChunkPlugin({
names: ['normalize', 'vendor']
})
)
コード分割
私たちが開発したのは1ページのアプリケーションで、デフォルトでは、各ページがappにパッケージされます.jsでは、ページを開くときに、すべてのページのコードをロードしてから表示する問題があります.そのため、必要なページをロードするためにコード分割が必要です.Webpack自体はコード分割機能を提供しています.webpack 1とwebpack 2+の実現は違います.*webpack 1はrequireを使用します.Ensure(),require(*)*webpack 2 import()を使用して、importはPromise*ensureを返してchunkに名前を付けることをサポートして、importはサポートしません
// webpack 1
require.ensure([], (require) => {
next(null, [
require('./Login').default(store),
require('./dashboard').default(store),
require('./NotFound').default
])
}, 'root')
// webpack 2
render () {
return (
<Router history={createHashHistory()}>
<AsyncRoute path='/counter' getComponent={() => import('./Counter').then(module => module.default)} />
Router>
)
}
コンパイルSASS
コンパイルsassは比較的簡単で、babelと同様にsass-loaderを呼び出せばよい.sass loaderの役割はsassをcssにコンパイルすることですが、webpackはcssをパッケージ化し、いくつかの調製作業が必要です.
{
loader: 'sass-loader',
options: {
sourceMap: false,
includePaths: [paths.client('assets/style')]
}
}
パッケージcss
cssをパッケージ化するには、いくつかのloader*style-loaderが必要です.
ラベル*css-loaderを します.cssの@import
とurl()
を します.ロードは、 するファイルのロードプロファイルに されています.file-loaderとurl-loader*resolve-url-loader:url()
の パスを します.*postcss-loader:cssを します. な はpostcssのpluginが する.checked {
background: url('assets/img/FixedPurchase/check_box_checked_2x.png') no-repeat;
background-size: 100% auto;
}
TO
.checked {
background:url(data:image/png;base64,iVBORw0KGgoAA...) no-repeat;
background-size: 100% auto;
}
{
test: /\.scss$/,
// webpack 1
// exclude: excludeCSSModules,
// loaders: [
// 'style',
// 'css',
// 'resolve-url-loader',
// 'postcss',
// 'sass?sourceMap'
// ]
use: [
{
loader: 'style-loader'
},
{
loader: 'css-loader',
options: {
sourceMap: useSouseMap,
minimize: minimize
}
},
{
loader: 'resolve-url-loader'
},
{
loader: 'postcss-loader',
options: postcssLoaderOptions
},
{
loader: 'sass-loader',
options: {
sourceMap: useSouseMap
}
}
])
}
postcss 、cssnanoプラグインを し、このプラグインはcssコードを するために されます.
const postcssLoaderOptions = {
plugins: function () {
return [
cssnano({
autoprefixer: {
add: true,
remove: true,
browsers: ['ie >= 8', 'firefox >= 15']
},
discardComments: {
removeAll: true
},
discardUnused: false,
mergeIdents: false,
reduceIdents: false,
safe: true,
sourcemap: useSouseMap
}),
flexfixes()
]
}
}
これで、 なcssができます.これらのスタイルは、ページに
ラベルを します.しかし、CSSファイル はありません!JS
UglifyJSPluginの
webpackConfig.plugins.push(
new webpack.optimize.UglifyJsPlugin({
output: {
comments: false
},
sourceMap: false,
compress: {
unsafe_comps: true,
properties: true,
keep_fargs: false,
pure_getters: true,
collapse_vars: true,
unsafe: true,
warnings: false,
screw_ie8: true,
sequences: true,
dead_code: true,
drop_debugger: true,
comparisons: true,
conditionals: true,
evaluate: true,
booleans: true,
loops: true,
unused: true,
hoist_funs: true,
if_return: true,
join_vars: true,
cascade: true,
drop_console: true // remove console.*
}
})
)
CSS
css-loaderにminimize=trueを える
{
loader: 'css-loader',
options: {
sourceMap: false,
minimize: true
}
}
その のリソース、 、フォントのロード
のリソースをロードするには、 に2つのloader:*file-loaderを します.
import img from './a.jsp'
で び されたのはfile-loaderです.ファイルのurl*url-loaderを します.file-loaderと じですが、base 64 dataを します.ファイルサイズが より さい // Images
// ------------------------------------
config.module.rules.push({
test : /\.(png|jpg|gif)$/,
loader : 'url-loader',
options : {
limit : 8192,
},
})
// Fonts
// ------------------------------------
;[
['woff', 'application/font-woff'],
['woff2', 'application/font-woff2'],
['otf', 'font/opentype'],
['ttf', 'application/octet-stream'],
['eot', 'application/vnd.ms-fontobject'],
['svg', 'image/svg+xml'],
].forEach((font) => {
const extension = font[0]
const mimetype = font[1]
config.module.rules.push({
test : new RegExp(`\\.${extension}$`),
loader : 'url-loader',
options : {
name : 'fonts/[name].[ext]',
limit : 10000,
mimetype,
},
})
})
CSSファイルの
cssファイルを し、extract-text-webpack-pluginを してこのpluginを2ステップに け、1つはpluginsの に します.もう1つは、
extract
メソッドを して されるloaderリストを のloaderリストに き えることです.// Styles
// ------------------------------------
const extractStyles = new ExtractTextPlugin({
filename: 'styles/[name].[contenthash].css',
allChunks: true,
disable: false,
})
config.module.rules.push({
test: /\.(sass|scss)$/,
loader: extractStyles.extract({
fallback: 'style-loader',
use: [
{
loader: 'css-loader',
options: {
sourceMap: useSouseMap,
minimize: minimize
}
},
{
loader: 'resolve-url-loader'
},
{
loader: 'postcss-loader',
options: postcssLoaderOptions
},
{
loader: 'sass-loader',
options: {
sourceMap: useSouseMap
}
}
]
})
})
HTMLの
これで、すべてのリソースの が い、HTMLが されます.html-webpack-pluginを して ページを します.HtmlWebpackPluginは、このページで されるすべてのjs、cssなどを し、 する
、
のラベルを するhtmlテンプレートに します.webpackConfig.plugins = [
new HtmlWebpackPlugin({
template: paths.client('index.html'),
hash: false,
filename: 'index.html',
inject: 'body',
publicPath : config.compiler_public_path,
minify: {
collapseWhitespace: true
}
})
]
その
のインポート
ページにjqueryをロードした 、ページにロードされます.コードで するには、ページにロードされています.コードで する は、webpackが$をどのように するかを えます.externalsの はこれです.
webpackConfig.externals = {
'jquery': 'jQuery',
'moment': 'moment',
'weui': 'weui'
}