我把项目使用的一个简单的弹窗组件做成插件,提交到npm了。
但是我安装之后发现图片资源的路径引用错误,找不到插件的图片。
检查代码发现图片被打包到dist/文件下面了,没有转化成base64并入代码中。
插件使用的vue-cli init webpack-simple 命令创建项目,webpack.config.js中的配置文件如下:
var path = require('path')
var webpack = require('webpack')
const NODE_ENV = process.env.NODE_ENV
module.exports = {
entry: NODE_ENV == 'development' ? './src/main.js' : './src/lib/index.js',
output: {
path: path.resolve(__dirname, './dist'),
publicPath: '/dist/',
library: 'easy-layer',
libraryTarget: 'umd',
filename: 'easy-layer.js'
},
module: {
rules: [
{
test: /\.css$/,
use: [
'vue-style-loader',
'css-loader'
],
}, {
test: /\.vue$/,
loader: 'vue-loader',
options: {
loaders: {
}
// other vue-loader options go here
}
},
{
test: /\.js$/,
loader: 'babel-loader',
exclude: /node_modules/
},
{
test: /\.(png|jpg|gif|svg)$/,
loader: 'file-loader',
options: {
name: '[name].[ext]?[hash]'
}
}
]
},
resolve: {
alias: {
'vue$': 'vue/dist/vue.esm.js'
},
extensions: ['*', '.js', '.vue', '.json']
},
devServer: {
historyApiFallback: true,
noInfo: true,
overlay: true
},
performance: {
hints: false
},
devtool: '#eval-source-map'
}
if (process.env.NODE_ENV === 'production') {
module.exports.devtool = '#source-map'
// http://vue-loader.vuejs.org/en/workflow/production.html
module.exports.plugins = (module.exports.plugins || []).concat([
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: '"production"'
}
}),
new webpack.optimize.UglifyJsPlugin({
sourceMap: true,
compress: {
warnings: false
}
}),
new webpack.LoaderOptionsPlugin({
minimize: true
})
])
}
我尝试过修改
{
test: /\.(png|jpg|gif|svg)$/,
loader: 'file-loader',
options: {
name: '[name].[ext]?[hash]'
}
}
增加了limit参数,但是没有效果。
试过不写任何代码,只写一个css和,引用logo.png,打包也没有转化图片资源。
这个问题该怎么解决?
在Vue.js中,我们可以使用npm来安装和管理依赖,然后使用npm的image
模块来处理图片资源。以下是一个基本的示例:
@vue/cli
和@vue/image
模块:npm install -g @vue/cli @vue/image
bash
vue create my-project
在项目根目录下创建一个名为public
的文件夹,用于存放公共图片资源。
在public
文件夹中创建一个名为images
的文件夹,用于存放项目内的图片资源。
在images
文件夹中创建一个名为index.html
的文件,如下所示:
```html
```
package.json
的文件,如下所示:json
{
"name": "my-project",
"version": "1.0.0",
"description": "My Vue Image Resource",
"main": "index.js",
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
},
"dependencies": {
"@vue/cli-plugin-babel": "^3.9.0",
"@vue/cli-plugin-eslint": "^3.9.0",
"@vue/cli-plugin-router": "^3.9.0",
"@vue/cli-plugin-vuex": "^3.9.0",
"@vue/cli-plugin-vuex-router-link": "^1.0.0",
"@vue/cli-plugin-vuex-router-link-scroll": "^1.0.0",
"axios": "^0.24.0",
"eslint": "^8.3.0",
"img-loader": "^6.1.2",
"node-sass": "^4.14.1",
"vue-style-loader": "^4.1.3",
"vue-template-compiler": "^2.6.14"
},
"devDependencies": {
"@vue/cli-plugin-eject": "^3.9.0",
"@vue/cli-plugin-eslint-tester": "^3.9.0",
"@vue/cli-plugin-router-tester": "^3.9.0",
"@vue/cli-plugin-vuex-tester": "^3.9.0",
"@vue/cli-plugin-vuex-router-link-tester": "^1.0.0",
"@vue/cli-plugin-vuex-router-link-scroll-tester": "^1.0.0",
"eslint-plugin-import": "^2.23.0",
"eslint-plugin-node": "^8.1.0",
"eslint-plugin-promise": "^4.0.2",
"eslint-plugin-standard": "^4.0.0",
"jest": "^26.5.0",
"postcss-loader": "^5.3.0",
"style-loader": "^1.1.1",
"vue-cli-plugin-image": "^1.0.0"
}
}
在项目根目录下创建一个名为src
的文件夹,用于存放项目内的静态资源,如CSS、JavaScript等。
在src
文件夹中创建一个名为index.css
的文件,如下所示:
```css body { margin: 0; padding: 0; font-family: Arial, sans-serif; }
img { max-width: 100%; height: auto; }
img:hover { transform: scale(1.1); } ```
在src
文件夹中创建一个名为src/components
的文件夹,用于存放组件中的图片资源。
在src/components
文件夹中创建一个名为MyComponent.vue
的文件,如下所示:
```html
{{ imageDescription }}
{{ imageTitle }}
```
src/components
文件夹中创建一个名为MyComponent.js
的文件,如下所示:```javascript import { Image } from '@/components/MyComponent.vue';
export default { name: 'MyComponent', props: { image: { type: String, required: true, }, }, mounted() { const imageURL = this.imageURL; const image = new Image(); image.src = imageURL; image.onload = () => { const srcKey = this.imageKey; this.$emit('image-uploaded', { src: image.src, srcKey: srcKey, }); }; }, }; ```
在项目根目录下创建一个名为src/router
的文件夹,用于处理路由功能。
在src/router
文件夹中创建一个名为MyComponent.js
的文件,如下所示:
```javascript import { Image } from '@/components/MyComponent.vue';
export default { name: 'MyComponent', routes: [ { path: '/my-image', component: () => import('/src/components/MyComponent.vue'), name: 'MyComponentImage', }, ], }; ```
src/router/index.js
的文件,如下所示:```javascript import Vue from 'vue'; import VueRouter from 'vue-router';
import App from './App.vue'; import MyComponent from './components/MyComponent.vue';
Vue.use(VueRouter);
const router = new VueRouter({ routes: [ { path: '/my-image', component: MyComponent, }, ], });
export default router; ```
在src/router/index.js
文件中,导入App.vue
和MyComponent.vue
并注册路由。
在src/router/index.js
文件中,注册MyComponent
路由:
```javascript import App from './App.vue'; import MyComponent from './components/MyComponent.vue';
Vue.use(VueRouter);
router.push('/my-image', { component: MyComponent, name: 'MyComponentImage', }); ```
src/main.js
文件中,使用npm run serve
命令启动项目并打开浏览器访问http://localhost:3000/my-image
,即可看到在组件中显示的图片资源。注意:在实际使用中,图片资源的上传、加载和渲染等逻辑可能需要根据具体需求进行调整,如使用axios库进行网络请求、设置图片大小限制、设置图片样式等。此外,为了确保图片资源的安全性,可能需要在http
请求中添加证书或使用一些安全的图片加载库,如PWA(Progressive Web App)和CORS(Cross-Origin Resource Sharing)等。