如何将 JS 和 CSS 拆分为单独的 HTML 文件?
How can I split the JS and CSS into separate HTML files?
我有一个非常具体的要求,我需要使用 HtmlWebpackPlugin
.[=18= 将 JS 脚本标签拆分为一个文件,将 CSS link 标签拆分为另一个文件]
目前, 脚本和 link 标签都将进入 文件。有没有办法分开做?
这是我当前的 Webpack 文件:
import webpack from 'webpack'
import path from 'path'
import HtmlWebpackPlugin from 'html-webpack-plugin'
import ExtractTextPlugin from 'extract-text-webpack-plugin'
import autoprefixer from 'autoprefixer'
const extractCSS = new ExtractTextPlugin({
filename: 'css/app.bundle.css',
allChunks: true
})
const createCSSfile = new HtmlWebpackPlugin({
chunks: ['app'],
minify: {
collapseWhitespace: true
},
hash: true,
template: 'src/ejs/css.ejs',
filename: 'templates/css.php'
})
const createJSfile = new HtmlWebpackPlugin({
chunks: ['app'],
minify: {
collapseWhitespace: true
},
hash: true,
template: 'src/ejs/js.ejs',
filename: 'templates/js.php'
})
const config = {
entry: {
'app': [
path.resolve(__dirname, 'src/js/app.js'),
path.resolve(__dirname, 'src/scss/app.scss')
]
},
output: {
path: path.resolve(__dirname, 'dist'),
publicPath: '/dist',
filename: 'js/app.bundle.js',
sourceMapFilename: 'js/app.bundle.map'
},
devtool: 'source-map',
watch: true,
watchOptions: {
ignored: /node_modules/,
aggregateTimeout: 300,
poll: 1000
},
module: {
rules: [
{
test: /\.(png|gif|jpg|jpeg)$/,
use: [
{
loader: 'file-loader',
options: {
name: '/images/[name].[ext]'
}
}
]
},
{
test: /\.(eot|ttf|woff|woff2|otf)$/,
use: [
{
loader: 'file-loader',
options: {
name: '/fonts/[name].[ext]'
}
}
]
},
{
test: /\.js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env'],
plugins: [require('@babel/plugin-proposal-object-rest-spread')]
}
}
},
{
test: /\.scss$/,
use: extractCSS.extract([
{
loader: 'css-loader'
},
{
loader: 'postcss-loader',
options: {
plugins () {
return [
autoprefixer({
browsers: [
'last 2 versions',
'Safari >= 8',
'Explorer >= 9',
'Android >= 4'
]
})
]
}
}
},
{
loader: 'sass-loader'
}
])
}
]
},
plugins: [
new webpack.DefinePlugin({
'process.env': {
'NODE_ENV': JSON.stringify(process.env.NODE_ENV)
}
}),
new webpack.optimize.CommonsChunkPlugin({
name: 'js/app.common',
filename: 'js/app.common.js',
minChunks: 2
}),
createCSSfile,
createJSfile,
extractCSS
]
}
export default config
每个 .ejs
文件都是空的,并在 .php
文件中生成以下内容:
<head><link href="/dist/css/app.bundle.css?bdba9ec6846a7d92d61f" rel="stylesheet"></head><script type="text/javascript" src="/dist/js/app.bundle.js?bdba9ec6846a7d92d61f"></script>
有没有办法把它们分开?
此外,我注意到它正在为 CSS link 插入一个 head
标签;有办法阻止这种情况发生吗?
由于您想要具有不同内容的单独文件,您可能想要拆分入口点并过滤块。
在 HtmlWebpackPlugin
的两个实例中,您设置 chunks: ['app']
其中包括 CSS 和 JS。
你可以有这样的东西:
entry: {
'js': [
path.resolve(__dirname, 'src/js/app.js')
],
'css': [
path.resolve(__dirname, 'src/scss/app.scss')
]
},
那么你可以:
const createCSSfile = new HtmlWebpackPlugin({
chunks: ['css'],
minify: {
collapseWhitespace: true
},
hash: true,
inject: false,
template: 'src/ejs/css.ejs',
filename: 'templates/css.php'
})
const createJSfile = new HtmlWebpackPlugin({
chunks: ['js'],
minify: {
collapseWhitespace: true
},
hash: true,
inject: false,
template: 'src/ejs/js.ejs',
filename: 'templates/js.php'
})
至于 CSS 包含在 <head>
中,您需要设置 inject: false
,因为您正在使用自己的自定义模板来创建 HTML 文件。 https://github.com/jantimon/html-webpack-plugin#configuration
在@mootrichard 的帮助下,我得到了我需要的答案。
要采取的步骤:
- 将JS和CSS分开到各自的入口点。
- 在
HtmlWebpackPlugin
配置中设置 inject: false
以阻止 Webpack 执行此操作。
- 在块中引用 'common' 以使通用 JS 文件可用于模板。
- 配置
.ejs
模板以循环文件数组。
webpack.config.babel.js
import webpack from 'webpack'
import path from 'path'
import HtmlWebpackPlugin from 'html-webpack-plugin'
import ExtractTextPlugin from 'extract-text-webpack-plugin'
import autoprefixer from 'autoprefixer'
const extractCSS = new ExtractTextPlugin({
filename: 'css/app.bundle.css',
allChunks: true
})
const createCSSfile = new HtmlWebpackPlugin({
chunks: ['css'],
excludeChunks: ['js', 'common'],
minify: {
collapseWhitespace: true,
preserveLineBreaks: true,
removeComments: true
},
inject: false,
hash: true,
template: 'src/ejs/css.ejs',
filename: 'templates/css.php'
})
const createJSfile = new HtmlWebpackPlugin({
chunks: ['js', 'common'],
excludeChunks: ['css'],
minify: {
collapseWhitespace: true,
preserveLineBreaks: true,
removeComments: true
},
inject: false,
hash: true,
template: 'src/ejs/js.ejs',
filename: 'templates/js.php'
})
const config = {
entry: {
'css': [
path.resolve(__dirname, 'src/scss/app.scss')
],
'js': [
path.resolve(__dirname, 'src/js/app.js')
]
},
output: {
path: path.resolve(__dirname, 'build'),
publicPath: '/build',
filename: 'js/app.bundle.js',
sourceMapFilename: 'js/app.bundle.map'
},
devtool: 'source-map',
watch: true,
watchOptions: {
ignored: /node_modules/,
aggregateTimeout: 300,
poll: 1000
},
module: {
rules: [
{
test: /\.(png|gif|jpg|jpeg)$/,
use: [
{
loader: 'file-loader',
options: {
name: '/images/[name].[ext]'
}
}
]
},
{
test: /\.(eot|ttf|woff|woff2|otf)$/,
use: [
{
loader: 'file-loader',
options: {
name: '/fonts/[name].[ext]'
}
}
]
},
{
test: /\.js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env'],
plugins: [require('@babel/plugin-proposal-object-rest-spread')]
}
}
},
{
test: /\.scss$/,
use: extractCSS.extract([
{
loader: 'css-loader'
},
{
loader: 'postcss-loader',
options: {
plugins () {
return [
autoprefixer({
browsers: [
'last 2 versions',
'Safari >= 8',
'Explorer >= 9',
'Android >= 4'
]
})
]
}
}
},
{
loader: 'sass-loader'
}
])
}
]
},
plugins: [
new webpack.DefinePlugin({
'process.env': {
'NODE_ENV': JSON.stringify(process.env.NODE_ENV)
}
}),
new webpack.optimize.CommonsChunkPlugin({
name: 'common',
filename: 'js/app.common.js',
minChunks: 2
}),
createCSSfile,
createJSfile,
extractCSS
]
}
export default config
js.ejs
<% for (let i = 0; i < htmlWebpackPlugin.files.js.length; i++) { %>
<script src="<%= htmlWebpackPlugin.files.js[i] %>"></script>
<% } %>
css.ejs
<% for (let i = 0; i < htmlWebpackPlugin.files.css.length; i++) { %>
<link rel="stylesheet" href="<%= htmlWebpackPlugin.files.css[i] %>">
<% } %>
希望这对以后的其他人有所帮助。
这种方法的好处
我需要将 JS 和 CSS 分离到实际的单独文件中的原因是为了在 WordPress 中使用,其中模板没有您继承自的 'master' 模板的概念,但是而是有基本的 footer 和 header includes.
因此,如果您使用的是 WordPress,那么这是一个非常好的方法。
我有一个非常具体的要求,我需要使用 HtmlWebpackPlugin
.[=18= 将 JS 脚本标签拆分为一个文件,将 CSS link 标签拆分为另一个文件]
目前, 脚本和 link 标签都将进入 文件。有没有办法分开做?
这是我当前的 Webpack 文件:
import webpack from 'webpack'
import path from 'path'
import HtmlWebpackPlugin from 'html-webpack-plugin'
import ExtractTextPlugin from 'extract-text-webpack-plugin'
import autoprefixer from 'autoprefixer'
const extractCSS = new ExtractTextPlugin({
filename: 'css/app.bundle.css',
allChunks: true
})
const createCSSfile = new HtmlWebpackPlugin({
chunks: ['app'],
minify: {
collapseWhitespace: true
},
hash: true,
template: 'src/ejs/css.ejs',
filename: 'templates/css.php'
})
const createJSfile = new HtmlWebpackPlugin({
chunks: ['app'],
minify: {
collapseWhitespace: true
},
hash: true,
template: 'src/ejs/js.ejs',
filename: 'templates/js.php'
})
const config = {
entry: {
'app': [
path.resolve(__dirname, 'src/js/app.js'),
path.resolve(__dirname, 'src/scss/app.scss')
]
},
output: {
path: path.resolve(__dirname, 'dist'),
publicPath: '/dist',
filename: 'js/app.bundle.js',
sourceMapFilename: 'js/app.bundle.map'
},
devtool: 'source-map',
watch: true,
watchOptions: {
ignored: /node_modules/,
aggregateTimeout: 300,
poll: 1000
},
module: {
rules: [
{
test: /\.(png|gif|jpg|jpeg)$/,
use: [
{
loader: 'file-loader',
options: {
name: '/images/[name].[ext]'
}
}
]
},
{
test: /\.(eot|ttf|woff|woff2|otf)$/,
use: [
{
loader: 'file-loader',
options: {
name: '/fonts/[name].[ext]'
}
}
]
},
{
test: /\.js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env'],
plugins: [require('@babel/plugin-proposal-object-rest-spread')]
}
}
},
{
test: /\.scss$/,
use: extractCSS.extract([
{
loader: 'css-loader'
},
{
loader: 'postcss-loader',
options: {
plugins () {
return [
autoprefixer({
browsers: [
'last 2 versions',
'Safari >= 8',
'Explorer >= 9',
'Android >= 4'
]
})
]
}
}
},
{
loader: 'sass-loader'
}
])
}
]
},
plugins: [
new webpack.DefinePlugin({
'process.env': {
'NODE_ENV': JSON.stringify(process.env.NODE_ENV)
}
}),
new webpack.optimize.CommonsChunkPlugin({
name: 'js/app.common',
filename: 'js/app.common.js',
minChunks: 2
}),
createCSSfile,
createJSfile,
extractCSS
]
}
export default config
每个 .ejs
文件都是空的,并在 .php
文件中生成以下内容:
<head><link href="/dist/css/app.bundle.css?bdba9ec6846a7d92d61f" rel="stylesheet"></head><script type="text/javascript" src="/dist/js/app.bundle.js?bdba9ec6846a7d92d61f"></script>
有没有办法把它们分开?
此外,我注意到它正在为 CSS link 插入一个 head
标签;有办法阻止这种情况发生吗?
由于您想要具有不同内容的单独文件,您可能想要拆分入口点并过滤块。
在 HtmlWebpackPlugin
的两个实例中,您设置 chunks: ['app']
其中包括 CSS 和 JS。
你可以有这样的东西:
entry: {
'js': [
path.resolve(__dirname, 'src/js/app.js')
],
'css': [
path.resolve(__dirname, 'src/scss/app.scss')
]
},
那么你可以:
const createCSSfile = new HtmlWebpackPlugin({
chunks: ['css'],
minify: {
collapseWhitespace: true
},
hash: true,
inject: false,
template: 'src/ejs/css.ejs',
filename: 'templates/css.php'
})
const createJSfile = new HtmlWebpackPlugin({
chunks: ['js'],
minify: {
collapseWhitespace: true
},
hash: true,
inject: false,
template: 'src/ejs/js.ejs',
filename: 'templates/js.php'
})
至于 CSS 包含在 <head>
中,您需要设置 inject: false
,因为您正在使用自己的自定义模板来创建 HTML 文件。 https://github.com/jantimon/html-webpack-plugin#configuration
在@mootrichard 的帮助下,我得到了我需要的答案。
要采取的步骤:
- 将JS和CSS分开到各自的入口点。
- 在
HtmlWebpackPlugin
配置中设置inject: false
以阻止 Webpack 执行此操作。 - 在块中引用 'common' 以使通用 JS 文件可用于模板。
- 配置
.ejs
模板以循环文件数组。
webpack.config.babel.js
import webpack from 'webpack'
import path from 'path'
import HtmlWebpackPlugin from 'html-webpack-plugin'
import ExtractTextPlugin from 'extract-text-webpack-plugin'
import autoprefixer from 'autoprefixer'
const extractCSS = new ExtractTextPlugin({
filename: 'css/app.bundle.css',
allChunks: true
})
const createCSSfile = new HtmlWebpackPlugin({
chunks: ['css'],
excludeChunks: ['js', 'common'],
minify: {
collapseWhitespace: true,
preserveLineBreaks: true,
removeComments: true
},
inject: false,
hash: true,
template: 'src/ejs/css.ejs',
filename: 'templates/css.php'
})
const createJSfile = new HtmlWebpackPlugin({
chunks: ['js', 'common'],
excludeChunks: ['css'],
minify: {
collapseWhitespace: true,
preserveLineBreaks: true,
removeComments: true
},
inject: false,
hash: true,
template: 'src/ejs/js.ejs',
filename: 'templates/js.php'
})
const config = {
entry: {
'css': [
path.resolve(__dirname, 'src/scss/app.scss')
],
'js': [
path.resolve(__dirname, 'src/js/app.js')
]
},
output: {
path: path.resolve(__dirname, 'build'),
publicPath: '/build',
filename: 'js/app.bundle.js',
sourceMapFilename: 'js/app.bundle.map'
},
devtool: 'source-map',
watch: true,
watchOptions: {
ignored: /node_modules/,
aggregateTimeout: 300,
poll: 1000
},
module: {
rules: [
{
test: /\.(png|gif|jpg|jpeg)$/,
use: [
{
loader: 'file-loader',
options: {
name: '/images/[name].[ext]'
}
}
]
},
{
test: /\.(eot|ttf|woff|woff2|otf)$/,
use: [
{
loader: 'file-loader',
options: {
name: '/fonts/[name].[ext]'
}
}
]
},
{
test: /\.js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env'],
plugins: [require('@babel/plugin-proposal-object-rest-spread')]
}
}
},
{
test: /\.scss$/,
use: extractCSS.extract([
{
loader: 'css-loader'
},
{
loader: 'postcss-loader',
options: {
plugins () {
return [
autoprefixer({
browsers: [
'last 2 versions',
'Safari >= 8',
'Explorer >= 9',
'Android >= 4'
]
})
]
}
}
},
{
loader: 'sass-loader'
}
])
}
]
},
plugins: [
new webpack.DefinePlugin({
'process.env': {
'NODE_ENV': JSON.stringify(process.env.NODE_ENV)
}
}),
new webpack.optimize.CommonsChunkPlugin({
name: 'common',
filename: 'js/app.common.js',
minChunks: 2
}),
createCSSfile,
createJSfile,
extractCSS
]
}
export default config
js.ejs
<% for (let i = 0; i < htmlWebpackPlugin.files.js.length; i++) { %>
<script src="<%= htmlWebpackPlugin.files.js[i] %>"></script>
<% } %>
css.ejs
<% for (let i = 0; i < htmlWebpackPlugin.files.css.length; i++) { %>
<link rel="stylesheet" href="<%= htmlWebpackPlugin.files.css[i] %>">
<% } %>
希望这对以后的其他人有所帮助。
这种方法的好处
我需要将 JS 和 CSS 分离到实际的单独文件中的原因是为了在 WordPress 中使用,其中模板没有您继承自的 'master' 模板的概念,但是而是有基本的 footer 和 header includes.
因此,如果您使用的是 WordPress,那么这是一个非常好的方法。